2013-06-05 3 views
0

Я видел этот класс, который выглядит следующим образом:Linq по сравнению с IComparer

/// <summary> 
    /// Provides an internal structure to sort the query parameter 
    /// </summary> 
    protected class QueryParameter 
    { 
     public QueryParameter(string name, string value) 
     { 
      Name = name; 
      Value = value; 
     } 

     public string Name { get; private set; } 
     public string Value { get; private set; } 
    } 

    /// <summary> 
    /// Comparer class used to perform the sorting of the query parameters 
    /// </summary> 
    protected class QueryParameterComparer : IComparer<QueryParameter> 
    { 
     public int Compare(QueryParameter x, QueryParameter y) 
     { 
      return x.Name == y.Name 
       ? string.Compare(x.Value, y.Value) 
       : string.Compare(x.Name, y.Name); 
     } 
    } 

Тогда позже вызов в коде, который делает вид:

parameters.Sort(new QueryParameterComparer()); 

который все работает отлично. Я решил, что это была пустая трата времени, создавая класс QueryParameter, который имел только имя, и было бы лучше использовать словарь. Со словарем, а не с помощью Sort (новый QueryParameterComparer()); Я полагал, что я мог бы просто сделать это:.

parameters.ToList().Sort((x, y) => x.Key == y.Key ? string.Compare(x.Value, y.Value) : string.Compare(x.Key, y.Key)); 

код компилируется нормально, но я не уверен, что он работает ли потому, что список только кажется, что выход в том же порядке, он был поставлен в Так, может кто-нибудь сказать меня, если я делаю это правильно или если я пропущу что-то простое?

Приветствия /r3plica

ответ

2

List<T>.Sort метод не является частью LINQ.

Вы можете использовать OrderBy/ThenBy методы расширения перед вызовом ToList():

parameters = parameter.OrderBy(x => x.Key).ThenBy(x => x.Value).ToList(); 
+0

Просто из любопытства, будет ли SortedDictionary устранять необходимость в сортировке? – r3plica

2

С вашего кода, я предполагаю, что parameters Ваш словарь, и вы звоните

parameters.ToList().Sort(...); 

и затем продолжая использование parameters.

ToList() создает новый список; вы затем сортируете этот список и , отбрасывая его. Вы не сортируете parameters вообще, и на самом деле вы не можете сортировать его, потому что это словарь.

Что вам нужно что-то вдоль линий

var parametersList = parameters.ToList(); 
parametersList.Sort(...); 

где ... является таким же, как и раньше.

Вы также могли бы сделать

var parametersList = parameters.OrderBy(...).ToList(); 

, который является более LINQ-й способ делать вещи.

Это может быть даже целесообразно, например,

foreach(var kvp in parameters.OrderBy(...)) 

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


Еще один момент отметить - это словарь не может содержать дубликаты ключей, так что нет никакой проверки x.Key == y.Key больше точки - вам просто нужно сортировать по (x, y) => string.Compare(x.Key, y.Key)

я был бы осторожен здесь, хотя - по внешнему виду, исходный код сделал поддерживает дубликаты ключей, поэтому, переключаясь на словарь, вы можете что-то сломать.

+0

Хорошее объяснение. Я знал об отсутствии дубликатов, но это именно то, что мне нужно, потому что OAuth не позволяет дублировать ключи – r3plica

0

Словарь эквивалентен только двум хэш-картам и позволяет вам получить доступ к любому элементу (заданному ключом) с помощью времени O (1) с точки зрения затрат (поскольку поиск по поиску выполняется на хеш-таблице).

Итак, если вы заказали элементы, потому что вы намеревались выполнить поиск по дискотомике позже, вам не нужно, чтобы вы использовали прямой словарь (или если бы вы запросили как значение в словаре, вы могли бы использовать пару словарей с теми же элементами, но с переключением пар ключей).

Как кто-то напишет передо мной, если вы зададите вопрос, как заказать список с помощью linq, вы должны работать с linq и с orderby thenby.

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