2010-08-16 2 views
-1

У меня есть следующий список:Как отсортировать список в C#?

List<Dictionary<int, Dictionary<string, string>>> lngList 
lngList.Add(new Dictionary<int,Dictionary<string,string>>().Add(1,new Dictionary<string,string>().Add("Item1Key","Item1Value"))); 
lngList.Add(new Dictionary<int,Dictionary<string,string>>().Add(3,new Dictionary<string,string>().Add("Item1Key","Item1Value"))); 
lngList.Add(new Dictionary<int,Dictionary<string,string>>().Add(2,new Dictionary<string,string>().Add("Item1Key","Item1Value"))); 
lngList.Add(new Dictionary<int,Dictionary<string,string>>().Add(4,new Dictionary<string,string>().Add("Item1Key","Item1Value"))); 

Мне нужно сортировать (по возрастанию) этот список на основе целого значения данного внутри словаря.

Это должно быть достигнуто без использования LINQ.

P.S. Это предполагает, что все введенные значения целых чисел уникальны.

+1

Ваша спецификация сортировки неполна. Если словарь содержит несколько значений, какой int должен использоваться, самый низкий? наибольший? Самый низкий, а затем использовать следующий-самый низкий для связей, когда два словаря имеют самый низкий уровень? –

+0

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

+1

На основе _which_ целочисленного значения, содержащегося в словаре? – tzaman

ответ

2

Самый простой способ решить решение заключается в использовании SortedList вместо списка:

пример:

SortedList<int, Dictionary<string, string>> lngList; 

это будет сортироваться по умолчанию по целочисленному значению

+0

Я не понимаю, как это отвечает на вопрос. Вопрос задает вопрос о том, как сортировать * список словарей *, а не список целых ключей. Предположительно, искатель спросил неправильный вопрос? – Timwi

+1

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

+0

Так, спросил искатель неправильного вопроса, что я и думал. – Timwi

3

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

lngList.Sort((a, b) => a.Keys.First().CompareTo(b.Keys.First())); 

Так как вы заявили, что «Это должно быть достигнуто без использования LINQ «Я предполагаю, что вы имеете в виду, что пространство имен System.Linq недоступно для вас. Но это не проблема: вам нужно .First() только, что вы можете легко определить себя:

public static class EnumerableExtensions { 
    public static T First<T>(this IEnumerable<T> source) { 
     using (var e = source.GetEnumerator()) { 
      if (!e.MoveNext()) 
       throw new InvalidOperationException("The collection is empty."); 
      return e.Current; 
     } 
    } 
} 

Если вы должны использовать .NET 2.0, которая не имеет лямбда-выражения или методы расширения, используйте вместо этого:

lngList.Sort(new Comparison<Dictionary<int, Dictionary<string, string>>>(sortFunc)); 

public int sortFunc(Dictionary<int, Dictionary<string, string>> a, 
        Dictionary<int, Dictionary<string, string>> b) 
{ 
    return First(a.Keys).CompareTo(First(b.Keys)); 
} 

public static T First<T>(IEnumerable<T> source) { 
    using (var e = source.GetEnumerator()) { 
     if (!e.MoveNext()) 
      throw new InvalidOperationException("The collection is empty."); 
     return e.Current; 
    } 
} 
+0

Btw, как лямбда-выражения, так и методы расширения могут использоваться в .NET 2.0. Вам нужно использовать компилятор C# 3.0, а для методов расширения вам нужно добавить некоторые метаданные, чтобы сделать компилятор счастливым, но я делаю это довольно часто сам. – Tergiver

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