Current area: HOME -> Blogs -> pheaven's Blog -> Read Post

Divvy up my list? Aye!

Posted on Thursday, January 31, 2008 at 4:28 AM
I wasn't born in Yorkshire, but I spent most of my childhood growing up there. Yorkshire, a large county in the north east of England, has its own collection of slang, not least including the word "aye", which it appears is appropriate in response to pretty much any situation. Another slang phrase is "divvy up". Basically, this just means to divide a bunch of things up somehow.

These days, I spend a lot of my time writing C#. If I'm dealing with a bunch of things in C#, I'll usually store them in a generic List collection, or some other collection. This got me thinking: how can I divvy up a List in C# into multiple Lists? And that's when I decided to implement the Divvy extension method.

What we're aiming for

Suppose we have a list of scores:
var Scores = new List<int>()
    { 87, 32, 45, 60, 91, 10, 58, 77, 66, 71 };
We want to categorize them by grade. For example, anything over and including 85 is a grade A, anything from 70 to 84 is a grade B and so on. This is where our Divvy extension method is going to come in useful. We'll look at what the following code means and how to implement the Divvy method in a moment, but using it will look like this:
// Split them up by grade.
var GradeScores = Scores.Divvy(new Dictionary<string, Predicate<int>>()
{
    { "Grade A", x => x >= 85 },
    { "Grade B", x => x >= 70 && x < 85 },
    { "Grade C", x => x >= 50 && x < 70 },
    { "Fail",    x => x < 50 }
});
It will give us back a Dictionary where the keys are the names of the categories we supplied when calling Divvy and the values are lists of items in that category. Therefore, we can loop over like this:
// Display results.
foreach (var Grade in GradeScores.Keys)
{
    Console.Write(Grade + ": ");
    foreach (var Score in GradeScores[Grade])
        Console.Write(Score.ToString() + " ");
    Console.WriteLine();
}
Which will give us the following output:
Grade A: 87 91
Grade B: 77 71
Grade C: 60 58 66
Fail: 32 45 10
Neat, huh? Let's take a look at how on earth we make this work.

Extension Methods

The first problem is that we want to have a method on the List class. However, that class is in the .Net class library, so we can't go changing it. We also don't want to have to start using a subclass of List all over the place just to get the extra method.

C# 3.0 allows you to write extension methods (detailed tutorial here). These are static methods that can be called as if they were instance methods. This way, we can write a method that can be called on instances of the List class. So our starting point is:
namespace Jnthn.ListExtensions
{
    public static class DivvyUp
    {
        public static void Divvy<T>(this List<T> TheList)
        {
            
        }
    }
}
Note the use of the "this" keyword to mark this as an extension method. Also note that List is a generic type - it takes a type parameter T. However, we don't know what this type is, and we want to make Divvy generic too. Thus we declare it as Divvy<T>.

The Return Type

We are going to split the List into many other Lists, based upon the category the item gets placed into. The categories are named by strings, e.g. "Grade A" and "Grade B". Therefore, for our return type we can use:
Dictionary<string, List<T>>
That is, a Dictionary where the keys are strings and the values are List<T>s, where T is the type of the original List that we were called on. Therefore, our method is now:
public static Dictionary<string, List<T>> Divvy<T>(
    this List<T> TheList)
{
    // Implementation goes here.
}

The Categorizers Parameter

Now we need a way to specify how to divvy up the list into the different categories. This is a mapping (from category name to something that determines whether an item is in that category), so we can use a Dictionary. The keys will be category names, which are of type string:
Dictionary<string,?>
However, what should the type of the values be? Well, they will be functions that take an item of type T and return a bool (true or false) depending on whether the item is in that category or not. There is a delegate in the .Net class library named Predicate<T> that specifies this type of function. Therefore, our parameter's type will be:
Dictionary<string, Predicate<T>>
Meaning that our full method declaration is:
public static Dictionary<string, List<T>> Divvy<T>(
    this List<T> TheList,
    Dictionary<string, Predicate<T>> Categorizers)
{
    // Implementation goes here.
}
You'll be glad to know that the implementation is simpler than the signature.

Initializing The Result Dictionary

Before we start categorizing the items, we need to set up the result Dictionary. We'll instantiate a Dictionary with the same type as the return type we worked out earlier. Then we will loop over the keys of the Categorizers parameter, which are the names of the categories, and create mappings in the Result dictionary from the names to empty Lists.
var Result = new Dictionary<string, List<T>>();
foreach (var Category in Categorizers.Keys)
    Result.Add(Category, new List<T>());

Divvying Up

Finally, we get to the code that's going to do the real work, and it's actually really quite straightforward.
foreach (var Item in TheList)
    foreach (var Category in Categorizers.Keys)
        if (Categorizers[Category](Item))
        {
            Result[Category].Add(Item);
            break; // Since we've divvy'd it into a list.
        }
The outer loop iterates over each item in the List that we were invoked on. The inner loop iterates over the names of the categories. The only slightly tricky part is the condition. Remember that the keys of the Dictionary are actually Predicate<T>s - functions that will return a bool when passed a value of type T. So we just call that function, passing the current Item as a parameter. If it returns true, then we know the item is in the current category. We add it to the correct result list, and then break. This takes us out of the inner loop, and we continue onto the next item in the List.

Putting it all together

Here's the Divvy method as a whole.
public static Dictionary<string, List<T>> Divvy<T>(
    this List<T> TheList,
    Dictionary<string, Predicate<T>> Categorizers)
{
    // Initialize result dictionary of lists.
    var Result = new Dictionary<string, List<T>>();
    foreach (var Category in Categorizers.Keys)
        Result.Add(Category, new List<T>());
    // Go through list items and divvy 'em up.
    foreach (var Item in TheList)
        foreach (var Category in Categorizers.Keys)
            if (Categorizers[Category](Item))
            {
                Result[Category].Add(Item);
                break; // Since we've divvy'd it into a list.
            }
    // And that's it.
    return Result;
}

Looking Back At The Call To Divvy

Let's take another quick look at the call to Divvy to better understand what is going on.
var GradeScores = Scores.Divvy(new Dictionary<string, Predicate<int>>()
{
    { "Grade A", x => x >= 85 },
    { "Grade B", x => x >= 70 && x < 85 },
    { "Grade C", x => x >= 50 && x < 70 },
    { "Fail",    x => x < 50 }
});
Here we are using two features of C# 3.0: collection initializers (tutorial here) and lambda expressions (tutorial here). First we instantiate a new Dictionary, with keys of type string and parameters of type Predicate<T> - exactly what we declared the Categorizers parameter of Divvy to be. Then we use a collection initializers to specify a list of key/value pairs. Each goes in curly brackets, separating the key from the value by a comma. Therefore, "Grade A", "Grade B" and so on are keys.

The values are lambda expressions. If you read where "=>" as "where", you can read the first one as, "x where x is greater than or equal to 85". Note that we are declaring x here - it is just a parameter name. Remember that a lambda expression declares an anonymous method (or function), and what comes to the left of the => is a parameter list. "x =>" declares the x, and "x >= 85" uses it.

Aye!

And that's your lot. Enjoy divvying up your lists, and I'm off to tuck into a nice Yorkshire pudding.

Comments
Oxycontin - Posted on Wednesday, February 27, 2008 at 3:19 PM by Buy Oxycontin
Thank you
Xanax - Posted on Friday, February 29, 2008 at 3:08 PM by Buy Xanax
Than you
Phentermine - Posted on Monday, March 03, 2008 at 2:44 PM by Buy Phentermine
Thank you for all
Cialis - Posted on Monday, March 03, 2008 at 2:45 PM by Buy Cialis
The best
Phentermine - Posted on Friday, March 07, 2008 at 5:07 PM by Buy phentermine onli
Thank you
xanax - Posted on Friday, March 07, 2008 at 5:08 PM by Buy xanax online
Thank you
ewr - Posted on Saturday, March 15, 2008 at 6:34 PM by buy oxycontin
ok f
sdf - Posted on Saturday, March 15, 2008 at 6:34 PM by buy xanax online
ok iy
sdf - Posted on Saturday, March 15, 2008 at 6:36 PM by buy valium online
sdf
sf - Posted on Saturday, March 15, 2008 at 6:37 PM by buy xanax
sdfsdg
ben - Posted on Monday, April 21, 2008 at 12:08 AM by ben
The Sites - where you can CHEAPEST CAR INSURANCE NOW:
http://carinsurancee.ipbfree.com
http://carinsurancer.ipbfree.com
http://carinsurancew.ipbfree.com
http://carinsurancea.ipbfree.com
http://carinsurances.ipbfree.com
http://onlinecarinsurance.ipbfree.com
http://carinsurancerates.ipbfree.com
http://carinsuranceratess.ipbfree.com
http://carinsurancequotes.ipbfree.com
http://carinsurancequote.ipbfree.com
http://cheapcarinsurance.ipbfree.com
http://carinsurancecompanies.ipbfree.com
http://carinsurancecompany.ipbfree.com
http://onlinecarinsurancer.ipbfree.com
http://classiccarinsurance.ipbfree.com
http://cheapestcarinsurance.ipbfree.com
http://bestcarinsurance.ipbfree.com
http://affordablecarinsurance.ipbfree.com
http://rentalcarinsurance.ipbfree.com
http://lowcostcarinsurance.ipbfree.com
http://carinsurancecoverage.ipbfree.com

http://carinsurancee.ipbfree.com/index.php?act=SC&c=1
http://carinsurancer.ipbfree.com/index.php?act=SC&c=1
http://carinsurancew.ipbfree.com/index.php?act=SC&c=1
http://carinsurancea.ipbfree.com/index.php?act=SC&c=1
http://carinsurances.ipbfree.com/index.php?act=SC&c=1
http://onlinecarinsurance.ipbfree.com/index.php?act=SC&c=1
http://carinsurancerates.ipbfree.com/index.php?act=SC&c=1
http://carinsuranceratess.ipbfree.com/index.php?act=SC&c=1
http://carinsurancequotes.ipbfree.com/index.php?act=SC&c=1
http://carinsurancequote.ipbfree.com/index.php?act=SC&c=1
http://cheapcarinsurance.ipbfree.com/index.php?act=SC&c=1
http://carinsurancecompanies.ipbfree.com/index.php?act=SC&c=1
http://carinsurancecompany.ipbfree.com/index.php?act=SC&c=1
http://onlinecarinsurancer.ipbfree.com/index.php?act=SC&c=1
http://classiccarinsurance.ipbfree.com/index.php?act=SC&c=1
http://cheapestcarinsurance.ipbfree.com/index.php?act=SC&c=1
http://bestcarinsurance.ipbfree.com/index.php?act=SC&c=1
http://affordablecarinsurance.ipbfree.com/index.php?act=SC&c=1
http://rentalcarinsurance.ipbfree.com/index.php?act=SC&c=1

http://lowcostcarinsurance.ipbfree.com/index.php?act=SC&c=1
http://carinsurancecoverage.ipbfree.com/index.php?act=SC&c=1

http://carinsurancee.ipbfree.com/index.php?act=idx
http://carinsurancer.ipbfree.com/index.php?act=idx
http://carinsurancew.ipbfree.com/index.php?act=idx
http://carinsurancea.ipbfree.com/index.php?act=idx
http://carinsurances.ipbfree.com/index.php?act=idx
http://onlinecarinsurance.ipbfree.com/index.php?act=idx
http://carinsurancerates.ipbfree.com/index.php?act=idx
http://carinsuranceratess.ipbfree.com/index.php?act=idx
http://carinsurancequotes.ipbfree.com/index.php?act=idx
http://carinsurancequote.ipbfree.com/index.php?act=idx
http://cheapcarinsurance.ipbfree.com/index.php?act=idx
http://carinsurancecompanies.ipbfree.com/index.php?act=idx
http://carinsurancecompany.ipbfree.com/index.php?act=idx
http://onlinecarinsurancer.ipbfree.com/index.php?act=idx
http://classiccarinsurance.ipbfree.com/index.php?act=idx
http://cheapestcarinsurance.ipbfree.com/index.php?act=idx
http://bestcarinsurance.ipbfree.com/index.php?act=idx
http://affordablecarinsurance.ipbfree.com/index.php?act=idx
http://rentalcarinsurance.ipbfree.com/index.php?act=idx
http://lowcostcarinsurance.ipbfree.com/index.php?act=idx
http://carinsurancecoverage.ipbfree.com/index.php?act=idx

http://carinsurancee.ipbfree.com/index.php?c=1
http://carinsurancer.ipbfree.com/index.php?c=1
http://carinsurancew.ipbfree.com/index.php?c=1
http://carinsurancea.ipbfree.com/index.php?c=1
http://carinsurances.ipbfree.com/index.php?c=1
http://onlinecarinsurance.ipbfree.com/index.php?c=1
http://carinsurancerates.ipbfree.com/index.php?c=1
http://carinsuranceratess.ipbfree.com/index.php?c=1
http://carinsurancequotes.ipbfree.com/index.php?c=1
http://carinsurancequote.ipbfree.com/index.php?c=1
http://cheapcarinsurance.ipbfree.com/index.php?c=1
http://carinsurancecompanies.ipbfree.com/index.php?c=1
http://carinsurancecompany.ipbfree.com/index.php?c=1
http://onlinecarinsurancer.ipbfree.com/index.php?c=1
http://classiccarinsurance.ipbfree.com/index.php?c=1
http://cheapestcarinsurance.ipbfree.com/index.php?c=1
http://bestcarinsurance.ipbfree.com/index.php?c=1
http://affordablecarinsurance.ipbfree.com/index.php?c=1
http://rentalcarinsurance.ipbfree.com/index.php?c=1
http://lowcostcarinsurance.ipbfree.com/index.php?c=1
http://carinsurancecoverage.ipbfree.com/index.php?c=1
http://cheaptramadolprescription.ipbfree.com
I only want to help you!
dddd - Posted on Friday, May 02, 2008 at 6:17 PM by dddd
WHEN U R READING THIS DONT STOP OR SOMETHING BAD WILL HAPPEN MY NAME IS SUMMER I AM 15 YEARS OLD i have BLONDE HAIR , SCARS no NOSE OR EARS I AM DEAD IF U DONT COPY THIS JUS LIKE FROM THE RING COPY N POST THIS ON 5 MORE SITES OR I WILL APPEAR ONE CREEPY NIGHT WEN UR NOT? ExPECTING IT BY YOUR BED WITH A NIFE AND KILL U THIS IS NO JOKE SUMMET ING GOOD WILL HAPPEN TO U IF YOU POST THIS ON 5 MORE FLASH BOXESa
sdf - Posted on Wednesday, May 07, 2008 at 4:52 PM by sdf
http://casinoscsaino.ipbfree.com
http://oonlinecasino.ipbfree.com
http://bestonlinecasino.ipbfree.com
http://onlinecasinoslots.ipbfree.com
http://onlinecasinobonus.ipbfree.com
http://playonlinecasinos.ipbfree.com
http://onlinevegascasinos.ipbfree.com
http://cashonlinecasino.ipbfree.com
http://onlinelasvegascasinos.ipbfree.com
http://casinosgamblinggame.ipbfree.com
http://onlinecasinosjackpot.ipbfree.com
http://casinokasinocazinokazino.ipbfree.com
http://casinogamess.ipbfree.com
http://casinosslotgames.ipbfree.com
http://hoylecasinosgames.ipbfree.com
http://grandcasinobiloxi.ipbfree.com
http://cheapcarrentals.ipbfree.com
http://hertzcarrentals.ipbfree.com
http://carsrentalsdeals.ipbfree.com
http://luxurycarsrentals.ipbfree.com
http://carrentalcompanies.ipbfree.com
http://discountcarrental.ipbfree.com
http://buyxanaxanaz.ipbfree.com
http://buyxanaxanazonline.ipbfree.com
http://buycheapestxanax.ipbfree.com
http://buy2mgxanaxno.ipbfree.com
http://orderxanax.ipbfree.com
http://genericforxanaxname.ipbfree.com
http://xanaxwithoutnoprescription.ipbfree.com
http://healthainsurance.ipbfree.com
http://seniorhealthinsurance.ipbfree.com
http://goodhealthinsurance.ipbfree.com
http://healthinsuranceonline.ipbfree.com
http://gatewayhealthinsurance.ipbfree.com
http://vreecreditreport.ipbfree.com
http://casinoscsaino.ipbfree.com/index.php?c=1
http://oonlinecasino.ipbfree.com/index.php?c=1
http://bestonlinecasino.ipbfree.com/index.php?c=1
http://onlinecasinoslots.ipbfree.com/index.php?c=1
http://onlinecasinobonus.ipbfree.com/index.php?c=1
http://playonlinecasinos.ipbfree.com/index.php?c=1
http://onlinevegascasinos.ipbfree.com/index.php?c=1
http://cashonlinecasino.ipbfree.com/index.php?c=1
http://onlinelasvegascasinos.ipbfree.com/index.php?c=1
http://casinosgamblinggame.ipbfree.com/index.php?c=1
http://onlinecasinosjackpot.ipbfree.com/index.php?c=1
http://casinokasinocazinokazino.ipbfree.com/index.php?c=1
http://casinogamess.ipbfree.com/index.php?c=1
http://casinosslotgames.ipbfree.com/index.php?c=1
http://hoylecasinosgames.ipbfree.com/index.php?c=1
http://grandcasinobiloxi.ipbfree.com/index.php?c=1
http://cheapcarrentals.ipbfree.com/index.php?c=1
http://hertzcarrentals.ipbfree.com/index.php?c=1
http://carsrentalsdeals.ipbfree.com/index.php?c=1
http://luxurycarsrentals.ipbfree.com/index.php?c=1
http://carrentalcompanies.ipbfree.com/index.php?c=1
http://discountcarrental.ipbfree.com/index.php?c=1
http://buyxanaxanaz.ipbfree.com/index.php?c=1
http://buyxanaxanazonline.ipbfree.com/index.php?c=1
http://buycheapestxanax.ipbfree.com/index.php?c=1
http://buy2mgxanaxno.ipbfree.com/index.php?c=1
http://orderxanax.ipbfree.com/index.php?c=1
http://genericforxanaxname.ipbfree.com/index.php?c=1
http://xanaxwithoutnoprescription.ipbfree.com/index.php?c=1
http://healthainsurance.ipbfree.com/index.php?c=1
http://seniorhealthinsurance.ipbfree.com/index.php?c=1
http://goodhealthinsurance.ipbfree.com/index.php?c=1
http://healthinsuranceonline.ipbfree.com/index.php?c=1
http://gatewayhealthinsurance.ipbfree.com/index.php?c=1
http://vreecreditreport.ipbfree.com/index.php?c=1
http://casinoscsaino.ipbfree.com/index.php?act=idx
http://oonlinecasino.ipbfree.com/index.php?act=idx
http://bestonlinecasino.ipbfree.com/index.php?act=idx
http://onlinecasinoslots.ipbfree.com/index.php?act=idx
http://onlinecasinobonus.ipbfree.com/index.php?act=idx
http://playonlinecasinos.ipbfree.com/index.php?act=idx
http://onlinevegascasinos.ipbfree.com/index.php?act=idx
http://cashonlinecasino.ipbfree.com/index.php?act=idx
http://onlinelasvegascasinos.ipbfree.com/index.php?act=idx
http://casinosgamblinggame.ipbfree.com/index.php?act=idx
http://onlinecasinosjackpot.ipbfree.com/index.php?act=idx
http://casinokasinocazinokazino.ipbfree.com/index.php?act=idx
http://casinogamess.ipbfree.com/index.php?act=idx
http://casinosslotgames.ipbfree.com/index.php?act=idx
http://hoylecasinosgames.ipbfree.com/index.php?act=idx
http://grandcasinobiloxi.ipbfree.com/index.php?act=idx
http://cheapcarrentals.ipbfree.com/index.php?act=idx
http://hertzcarrentals.ipbfree.com/index.php?act=idx
http://carsrentalsdeals.ipbfree.com/index.php?act=idx
http://luxurycarsrentals.ipbfree.com/index.php?act=idx
http://carrentalcompanies.ipbfree.com/index.php?act=idx
http://discountcarrental.ipbfree.com/index.php?act=idx
http://buyxanaxanaz.ipbfree.com/index.php?act=idx
http://buyxanaxanazonline.ipbfree.com/index.php?act=idx
http://buycheapestxanax.ipbfree.com/index.php?act=idx
http://buy2mgxanaxno.ipbfree.com/index.php?act=idx
http://orderxanax.ipbfree.com/index.php?act=idx
http://genericforxanaxname.ipbfree.com/index.php?act=idx
http://xanaxwithoutnoprescription.ipbfree.com/index.php?act=idx
http://healthainsurance.ipbfree.com/index.php?act=idx
http://seniorhealthinsurance.ipbfree.com/index.php?act=idx
http://goodhealthinsurance.ipbfree.com/index.php?act=idx
http://healthinsuranceonline.ipbfree.com/index.php?act=idx
http://gatewayhealthinsurance.ipbfree.com/index.php?act=idx
http://vreecreditreport.ipbfree.com/index.php?act=idx
http://casinoscsaino.ipbfree.com/index.php?act=SC&c=1
http://oonlinecasino.ipbfree.com/index.php?act=SC&c=1
http://bestonlinecasino.ipbfree.com/index.php?act=SC&c=1
http://onlinecasinoslots.ipbfree.com/index.php?act=SC&c=1
http://onlinecasinobonus.ipbfree.com/index.php?act=SC&c=1
http://playonlinecasinos.ipbfree.com/index.php?act=SC&c=1
http://onlinevegascasinos.ipbfree.com/index.php?act=SC&c=1
http://cashonlinecasino.ipbfree.com/index.php?act=SC&c=1
http://onlinelasvegascasinos.ipbfree.com/index.php?act=SC&c=1
http://casinosgamblinggame.ipbfree.com/index.php?act=SC&c=1
http://onlinecasinosjackpot.ipbfree.com/index.php?act=SC&c=1
http://casinokasinocazinokazino.ipbfree.com/index.php?act=SC&c=1
http://casinogamess.ipbfree.com/index.php?act=SC&c=1
http://casinosslotgames.ipbfree.com/index.php?act=SC&c=1
http://hoylecasinosgames.ipbfree.com/index.php?act=SC&c=1
http://grandcasinobiloxi.ipbfree.com/index.php?act=SC&c=1
http://cheapcarrentals.ipbfree.com/index.php?act=SC&c=1
http://hertzcarrentals.ipbfree.com/index.php?act=SC&c=1
http://carsrentalsdeals.ipbfree.com/index.php?act=SC&c=1
http://luxurycarsrentals.ipbfree.com/index.php?act=SC&c=1
http://carrentalcompanies.ipbfree.com/index.php?act=SC&c=1
http://discountcarrental.ipbfree.com/index.php?act=SC&c=1
http://buyxanaxanaz.ipbfree.com/index.php?act=SC&c=1
http://buyxanaxanazonline.ipbfree.com/index.php?act=SC&c=1
http://buycheapestxanax.ipbfree.com/index.php?act=SC&c=1
http://buy2mgxanaxno.ipbfree.com/index.php?act=SC&c=1
http://orderxanax.ipbfree.com/index.php?act=SC&c=1
http://genericforxanaxname.ipbfree.com/index.php?act=SC&c=1
http://xanaxwithoutnoprescription.ipbfree.com/index.php?act=SC&c=1
http://healthainsurance.ipbfree.com/index.php?act=SC&c=1
http://seniorhealthinsurance.ipbfree.com/index.php?act=SC&c=1
http://goodhealthinsurance.ipbfree.com/index.php?act=SC&c=1
http://healthinsuranceonline.ipbfree.com/index.php?act=SC&c=1
http://gatewayhealthinsurance.ipbfree.com/index.php?act=SC&c=1
http://vreecreditreport.ipbfree.com/index.php?act=SC&c=1
http://cheaptramadolprescription.ipbfree.com
sdf - Posted on Monday, May 12, 2008 at 4:20 PM by sdf
http://vredit.wikidot.com/free-credit-report
http://vredit.wikidot.com/free-annual-credit-report
http://vredit.wikidot.com/free-credit-report-com
http://vredit.wikidot.com/free-online-credit-report
http://vredit.wikidot.com/my-free-credit-report
http://vredit.wikidot.com/free-credit-report-on-line
http://vredit.wikidot.com/free-credit-report-and-score
http://vredit.wikidot.com/free-credit-report-government
http://vredit.wikidot.com/free-credit-score-report
http://vredit.wikidot.com/free-anual-credit-report
http://vredit.wikidot.com/get-a-free-credit-report
http://vredit.wikidot.com/www-free-credit-report-com
http://vredit.wikidot.com/get-free-credit-report
http://vredit.wikidot.com/free-yearly-credit-report
http://vredit.wikidot.com/free-credit-reports
http://vredit.wikidot.com/credit-report-for-free
http://vredit.wikidot.com/experian-free-credit-report
http://vredit.wikidot.com/free-annual-credit-report-com
http://vredit.wikidot.com/free-credit-report-no-credit-card
http://vredit.wikidot.com/free-credit-report-gov
http://vredit.wikidot.com/free-copy-of-credit-report
http://vredit.wikidot.com/free-instant-credit-report
http://vredit.wikidot.com/free-credit-report-no-credit-card-required
http://vredit.wikidot.com/totally-free-credit-report
http://vredit.wikidot.com/free-annual-credit-reports
http://vredit.wikidot.com/free-credit-reports-online
http://vredit.wikidot.com/how-to-get-a-free-credit-report
http://vredit.wikidot.com/my-free-credit-report-com
http://vredit.wikidot.com/your-free-credit-report


Sponsored links

Build IT Knowledge with Current & Trusted Content
Helps Employees Develop & Hone New Technical Programming Skills. Sign Up & Get Full Access.
Check Out IT Certification Preparation Materials
Sign Up With SkillSoft & Get Access to Training Materials for Over 50 Professional Certifications.
Six Sigma Certification
100% Online-Six Sigma Certificate from Villanova - Find Out More Now.
Virtual File System SDK
Create your own file systems in Windows and .NET applications
PureCM Software Configuration Management
Version control and integrated issue tracking - powerful and easy to use. Get your FREE trial now!


Newsletter | Submit Content | About | Advertising | Awards | Contact Us | Link to us |
© 1996-2008 Community Networks Ltd All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited. Violators of this policy may be subject to legal action. Please read Terms Of Use and Privacy Statement for more information. Development by Synchron Data - .NET development.