2009-01-16 24 views

cevap

40

düzenleme bu yanıtı düzenlemeden önce; Güncelleştirilmiş soruna bir yanıt için bkz. this reply.

Neden LINQ kullanıyorsunuz? - ...

+0

20 saniyeden sonra beni yendi – JaredPar

+0

Sadece orijinal sorgumda köşeli parantezleri geri almadığımı fark ettim. – Guy

+0

Bunun kabul edilen cevap olduğuna sevindim, çünkü OP'nin sormak istediği şeyi cevaplamadı. Bu başlık sorununun kesinlikle doğru cevabıdır. –

8

yok LINQ tabi ama rahatsız olmaz Sen bir ToSortedDictionary ekleyebilir

new SortedDictionary<int, string>(existing); 

: Bunun için bir yapıcı yoktur. SortedDictionary dönüşüm yapmak için bir kurucu vardır.

public SortedDictionary<TKey,TValue> Convert<TKey,TValue>(Dictionary<TKey,TValue> map) { 
    return new SortedDictionary<TKey,TValue>(map); 
} 
1

Sen LINQ, sadece bazı şık uzatma yöntemleri gerekmez:

public static IDictionary<TKey, TValue> Sort<TKey, TValue>(this IDictionary<TKey, TValue> dictionary) 
{ 
    if(dictionary == null) 
    { 
     throw new ArgumentNullException("dictionary"); 
    } 

    return new SortedDictionary<TKey, TValue>(dictionary); 
} 

public static IDictionary<TKey, TValue> Sort<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, IComparer<TKey> comparer) 
{ 
    if(dictionary == null) 
    { 
     throw new ArgumentNullException("dictionary"); 
    } 

    if(comparer == null) 
    { 
     throw new ArgumentNullException("comparer"); 
    } 

    return new SortedDictionary<TKey, TValue>(dictionary, comparer); 
} 

Örnek kullanım: Eğer almaya zarif bir şekilde talep ediyorlar sanki

var dictionary = new Dictionary<int, string> 
{ 
    { 1, "one" }, 
    { 2, "two" }, 
    { 0, "zero" } 
}; 

foreach(var pair in dictionary.Sort()) 
{ 
    Console.WriteLine("{0}: {1}", pair.Key, pair.Value); 
} 

// 0: zero 
// 1: one 
// 2: two 
5

görünüyor Dictionary<TKey,TValue> ve onu SortedDictionary<TValue,TKey>'a dönüştürün (Dictionary'un değeri şimdi SortedDictionary'un anahtarıdır). Burada cevap veren herhangi bir cevap göremiyorum.

şuna benzer bir uzantısı yöntemi oluşturabilirsiniz:

static class Extensions 
{ 
    public static Dictionary<TValue, TKey> 
     AsInverted<TKey, TValue>(this Dictionary<TKey, TValue> source) 
    { 
     var inverted = new Dictionary<TValue, TKey>(); 

     foreach (KeyValuePair<TKey, TValue> key in source) 
      inverted.Add(key.Value, key.Key); 

     return inverted; 
    } 
} 

Ve uygulama kodu şu şekilde görünecektir:

using System; 
using System.Linq; 
using System.Collections.Generic; 

class Program 
{ 
    static void Main() 
    { 
     var dict = new Dictionary<String, Double>(); 
     dict.Add("four", 4); 
     dict.Add("three", 3); 
     dict.Add("two", 2); 
     dict.Add("five", 5); 
     dict.Add("one", 1); 

     var sortedDict = new SortedDictionary<Double, String>(dict.AsInverted()); 
    } 
} 
0

ToDictionary kullanarak İnversiyon:

public static IDictionary<TValue, TKey> Invert<TKey, TValue>(this IDictionary<TKey, TValue> dictionary) 
{ 
    if(dictionary == null) 
    { 
     throw new ArgumentNullException("dictionary"); 
    } 

    return dictionary.ToDictionary(pair => pair.Value, pair => pair.Key); 
} 

Örnek kullanımı:

var dictionary = new Dictionary<string, int> 
{ 
    { "zero", 0 }, 
    { "one", 1 }, 
    { "two", 2 } 
}; 

foreach(var pair in dictionary.Invert()) 
{ 
    Console.WriteLine("{0}: {1}", pair.Key, pair.Value); 
} 

// 0: zero 
// 1: one 
// 2: two 

Örnek tersyüz ve (Sort tanımlanması için benim diğer yanıt bakın) sıralama:

var dictionary = new Dictionary<string, int> 
{ 
    { "one", 1 }, 
    { "two", 2 }, 
    { "zero", 0 } 
}; 

foreach(var pair in dictionary.Invert().Sort()) 
{ 
    Console.WriteLine("{0}: {1}", pair.Key, pair.Value); 
} 

// 0: zero 
// 1: one 
// 2: two 
İlgili konular