Sıklıkla anahtarlar & değerlerden oluşan bir sözlüğü değere göre sıralamam gerekir. Örneğin, sıklığa göre sıralamak istediğim kelimelerden ve ilgili sıklıklardan oluşan bir karmam var.
Tek bir değer (örneğin frekans) için iyi olan bir SortedList
var, bunu kelimeye geri eşlemek istiyorum.
SortedDictionary değere göre değil, anahtara göre sıralar. Bazıları custom class'a başvuruyor, ancak daha temiz bir yol var mı?
Kullan:
using System.Linq.Enumerable;
...
List<KeyValuePair<string, string>> myList = aDictionary.ToList();
myList.Sort(
delegate(KeyValuePair<string, string> pair1,
KeyValuePair<string, string> pair2)
{
return pair1.Value.CompareTo(pair2.Value);
}
);
NET 2.0 veya üstünü hedeflediğiniz için, bunu lambda sözdizimine basitleştirebilirsiniz - eşdeğerdir, ancak daha kısadır. NET 2.0'ı hedefliyorsanız, bu sözdizimini yalnızca Visual Studio 2008 (veya üstü) derleyicisini kullanıyorsanız kullanabilirsiniz.
var myList = aDictionary.ToList();
myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
Etrafa bakarak ve bazı C# 3.0 özelliklerini kullanarak bunu yapabiliriz:
foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value))
{
// do something with item.Key and item.Value
}
Bu benim gördüğüm en temiz yoldur ve Ruby'nin hash'leri işleme yöntemine benzer.
Yüksek seviyede, tüm Sözlük boyunca yürümekten ve her bir değere bakmaktan başka seçeneğiniz yoktur.
Belki bu yardımcı olur: http://bytes.com/forum/thread563638.html John Timney'den kopyala/yapıştır:
Dictionary<string, string> s = new Dictionary<string, string>();
s.Add("1", "a Item");
s.Add("2", "c Item");
s.Add("3", "b Item");
List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(s);
myList.Sort(
delegate(KeyValuePair<string, string> firstPair,
KeyValuePair<string, string> nextPair)
{
return firstPair.Value.CompareTo(nextPair.Value);
}
);