2012-05-22 3 views
3
Random r = new Random(); 
List<object> myList = new List<object>(); 

for (int i = 0; i < 100; i++) 
    myList.Add(new { A = r.Next(), B = r.Next() }); 

myList.Sort((obj1, obj2) => obj1.A.CompareTo(obj2.A)); 

Приведенный выше код определяет общий List заполнит его 100 анонимных переменных с двумя членами, A и B.Сортировка списка <object> наполненную анонимных типов без LINQ

Допустим, я хочу, чтобы отсортировать MyList на A. Окончательная строка пытается отсортировать список, однако этот код явно не компилируется, потому что компилятор не знает, что содержит список объектов.

Без использования LINQ, можно ли каким-либо образом отсортировать этот список с помощью лямбда или подобного?

ответ

6

Можно сортировать без LINQ, до тех пор, как вам удается объявить список, как из списка объектов анонимного типа с использованием синтаксиса var, или готовы использовать dynamic:

Random r = new Random(); 
List<dynamic> myList = new List<object>(); 

for (int i = 0; i < 100; i++) 
    myList.Add(new { A = r.Next(), B = r.Next() }); 

myList.Sort((obj1, obj2) => obj1.A.CompareTo(obj2.A)); 
+0

Вы не сказали, что в первом, но теперь вы отредактировали его. :-) – jason

+0

@Jason Я перечитал ответ и понял, что первая часть может быть запутанной, поэтому я упомянул «var». – dasblinkenlight

+0

+1. Чтобы использовать строго типизированную версию, см. Мой ответ (мне нужен вспомогательный метод) –

2

Во-первых, вы можете использовать LINQ, если вы очень осторожно использовать неявную типизацию:

var myList = Enumerable.Range(0, 100) 
         .Select(index => new { A = r.Next(), B = r.Next() }) 
         .ToList(); 
myList.Sort((obj1, obj2) => obj1.A.CompareTo(obj2.A)); 

Во-вторых, если вы готовы использовать dynamic, введите список как List<dynamic>, а затем вы можете использовать LINQ непосредственно.

Однако я действительно не понимаю, почему вы настаиваете на приклеивании к анонимным типам. Просто сделайте номинальный тип и погрейтесь в славе, которая является сильной машиной, безопасностью во время компиляции и LINQ!

1

В LINQ нет волшебства - вы можете посмотреть все сигнатуры методов и посмотреть, как будут вычисляться типы.

Вы хотите что-то вроде этого, чтобы создать список вашего типа (аналог из ToList() расширения):

List<T> NewList<T>(T ignored) 
{ 
    return new List<T>(); 
} 

и использовать его в качестве

Random r = new Random(); 
var myList = NewList(new { A = r.Next(), B = r.Next() }); 

for (int i = 0; i < 100; i++) 
    myList.Add(new { A = r.Next(), B = r.Next() }); 

myList.Sort((obj1, obj2) => obj1.A.CompareTo(obj2.A)); 
Смежные вопросы