Question: What is the largest open source project written in Visual C++ ?

I can see that eMule project is pretty big, but what is largest?

Answer: 
If you put your preferences into a list, it might become easier.

```
List<String> data = new List<String> { "A","B","A","C","B","C","D","E" };
List<String> preferences = new List<String> { "A","B","C" };

IEnumerable<String> orderedData = data.OrderBy(
   item => preferences.IndexOf(item));

```

This will put all items not appearing in `preferences` in front because `IndexOf()` returns `-1`. An ad hoc work around might be reversing `preferences` and order the result descending. This becomes quite ugly, but works.

```
IEnumerable<String> orderedData = data.OrderByDescending(
   item => Enumerable.Reverse(preferences).ToList().IndexOf(item));

```

The solution becomes a bit nicer if you concat `preferences` and `data`.

```
IEnumerable<String> orderedData = data.OrderBy(
   item => preferences.Concat(data).ToList().IndexOf(item));

```

I don't like `Concat()` and `ToList()` in there. But for the moment I have no really good way around that. I am looking for a nice trick to turn the `-1` of the first example into a big number.
Yes, you must implement your own `IComparer<string>` and then pass it in as the second argument of LINQ's OrderBy method.

An example can be found here:
[Ordering LINQ results](http://srtsolutions.com/blogs/billwagner/archive/2006/03/29/ordering-linq-results.aspx)