2014-01-09 2 views
0

У меня есть коллекция, которая сортируется произвольно на основе условий. Мой класс имеет свойство «Ordinal» int, которое я хотел бы динамически заполнить после того, как коллекция будет упорядочена. Вот то, что я до сих пор:Динамически увеличиваемое свойство для коллекции IEnumerable?

var result = new List<MyClass>(); 
foreach (var x in items) 
{ 
    x.TestA = x.TestA; 
    x.TestB = x.TestB; 
    x.TestC = x.TestC; 
} 
... 
var ordered = result.AsEnumerable(); 
if (...) ordered.OrderBy(x => x.TestA); 
else if (...) ordered.OrderBy(x => x.TestB); 
else if (...) ordered.OrderBy(x => x.TestC); 
... 
return ordered.ToList() 

Перед возвращением упорядоченного списка, что это лучший способ, чтобы заполнить «Порядковое» свойство объекта «MyClass» в коллекции с его индексом местом? Я не хочу создавать еще один цикл в конце, так как у меня тысячи записей. Это единственный способ? Спасибо за любую помощь или советую.

+0

'OrderBy' (как и другие методы' Enumerable', которые возвращают 'IEnumerable '), не влияют на последовательность источников. Ваш код всегда будет возвращать неупорядоченную последовательность. Кроме того, 'List ' уже есть 'IEnumerable ', следовательно, 'result.AsEnumerable()' является излишним. Вам нужно что-то вроде 'IEnumerable ordered = result; если (условие 1) упорядочено = упорядочено.OrderBy (x => x.TestA); // else if (...) и т. д. – Dennis

ответ

1

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

return ordered.Select((x, i) => { x.Ordinal = i; return x; }).ToList() 

Это будет работать только если ваш MyClass действительно ссылочный тип (class).

Смежные вопросы