2015-01-30 2 views
0

То, что я пытаюсь сделать, это перебрать сборную страны в retVal и отсортировать каждый из <StateProvinces> по Name. Иерархия выглядит следующим образом:Сортировка списка с помощью лямбда?

retVal[index].StateProvinces.ToList()[index].Name = ""; 

так, что объект страны -> коллекция состояний, каждое состояние имеет свойство имени и отложенная загрузка его метания государственных объектов в порядок, основанный на stateID.

Что не так с этой строкой кода (и почему, хотя я предполагаю, что я пытаюсь использовать метод сортировки)?

retVal[0].StateProvinces.ToList().Sort(x=>x.Name); 

retVal имеет тип IList<Country>

Ошибка задается для x=>x.Name:

Delegate 'System.Comparison<Country>' does not take 1 arguments 
+1

'.OrderBy (x => x.Name);' –

ответ

3

Comparison делегат является делегатом, который представляет собой сравнение, а не проецирование. То есть он принимает два объекта, а результат указывает, какой из них «меньше». Вы пытаетесь обеспечить проекцию или преобразование одного объекта в другой.

Чтобы написать сравнение для двух из этих объектов на основе Name вы должны написать что-то вроде:

(a,b) => string.Compare(a.Name, b.Name); 

Вы также можете написать отдельный метод для сортировки списков, которые используют проекцию вместо компаратора , так что вам не нужно делать это для каждого вызова Sort:

//TODO come up with a better name, but it still has to be different from `Sort` 
public static void ProjectionSort<T, TKey>(
    this List<T> list, 
    Func<T, TKey> selector, 
    Comparer<TKey> comparer) 
{ 
    comparer = comparer ?? Comparer<TKey>.Default; 
    list.Sort((a, b) => comparer.Compare(selector(a), selector(b))); 
} 
+0

Это работает, вроде. Я могу посмотреть, как это происходит на самом деле, но на самом деле не сохраняет отсортированные объекты обратно в retVal [index] .StateProvinces. Что я здесь делаю неправильно? – MetalPhoenix

+0

@MetalPhoenix Вы вытаскиваете все элементы из последовательности, создавая новый список для хранения этих данных, сортировки этого списка и затем выброса этого списка, не делая ничего с ним. Если вы хотите сохранить результат в этом свойстве, вам нужно явно сохранить результат в этом свойстве. – Servy

+0

А, я думаю, я понимаю. Я думал, что он ничего не вернет, так как тип возврата в VS показан как «пустота». Также выясняется, что в разделе кода, который я нашел сегодня, есть какой-то сумасшедший худу, которого я не видел до глубины души в архитектуре проекта. Спасибо за совет. – MetalPhoenix

2

Как говорит об ошибке, Comparison<T> принимает два аргумента не один, вы хотите что-то вроде этого:

retVal[0].StateProvinces.ToList().Sort((x,y) => x.Name.CompareTo(y.Name)); 
+1

Это сломается, если имена будут "null". – Servy

1

Ок .. Я очень расстроен этим вопросом вчера вечером и сегодня утром понял, что реальная проблема в том, что .Sort не там. Метод, который вам нужно вызвать в «Сортировка» ваших коллекций, - .OrderBy.

Надеюсь, это поможет кому-то не вытащить все свои волосы.

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