請找到他附加的圖像。 基於字典中的鍵排序
ls是dicionary<string, string>
。我想根據關鍵字進行排序。但是,如果密鑰類似於
7020_1,7020_23,7030_5。 7020_8,7030_1。
我希望它被安排爲
7020_1,7020_8,7020_23,7030_1.7030_5。
讓我知道解決方案。
請找到他附加的圖像。 基於字典中的鍵排序
ls是dicionary<string, string>
。我想根據關鍵字進行排序。但是,如果密鑰類似於
7020_1,7020_23,7030_5。 7020_8,7030_1。
我希望它被安排爲
7020_1,7020_8,7020_23,7030_1.7030_5。
讓我知道解決方案。
這裏一個簡單的解決方案。
Dictionary<string, string> d = dic.OrderBy(x => int.Parse(x.Key.Split('_')[0])).ThenBy(x => int.Parse(x.Key.Split('_')[1])).ToDictionary(j => j.Key, j => j.Value);
您可以通過
拆分您的字符串解析,然後爲了你應該使用:
SortedDictionary(TKEY,TValue),讓你的IComparer(T)接口則其將被排序的自己的規則。
這裏是一個簡短的控制檯應用程序演示瞭解決方案:
class KeyComparer : IComparer<string>
{
public int Compare(string x, string y)
{
var xSplit = x.Split('_').Select(i => Convert.ToInt32(i)).ToArray();
var ySplit = y.Split('_').Select(i => Convert.ToInt32(i)).ToArray();
var diff1 = xSplit[0] - ySplit[0];
return diff1 != 0 ? diff1 : xSplit[1] - ySplit[1];
}
}
class Program
{
static void Main(string[] args)
{
var comparer = new KeyComparer();
var sortedDic = new SortedDictionary<string, object>(comparer)
{
{"7020_23", new object()},
{"7030_1", new object()},
{"7030_5", new object()},
{"7020_8", new object()},
{"7020_1", new object()}
};
foreach (var key in sortedDic.Keys)
{
Console.WriteLine(key);
}
}
}
輸出是:
7020_1
7020_8
7020_23
7030_1
7030_5
請注意,此解決方案假定關鍵是總是由2部分組成,可以解析爲整數,並由u nderscore。
您需要創建自己的Comparer
以傳遞到OrderBy
,因爲您需要進行整數比較而不是字符串。我使用了List
,但這並沒有改變。
static void Main(string[] args)
{
var d = new List<string>() { "7020_8", "7030_5", "7020_23", "7020_1", "7030_1" };
Console.WriteLine("In:");
foreach (string s in d)
Console.WriteLine(s);
Console.WriteLine();
Console.WriteLine("Sorted Out:");
foreach (string s in d.OrderBy(f => f, new MyComparer()))
Console.WriteLine(s);
Console.ReadLine();
}
internal class MyComparer : IComparer<string>
{
#region IComparer<string> Members
public int Compare(string x, string y)
{
//return <0 if x < y, 0 if x = y, >0 if x > y
//if the strings are equal return 0 now
if (x.CompareTo(y) == 0)
return 0;
int x1, x2;
int y1, y2;
//split the strings on _
x1 = Convert.ToInt32(x.Split('_')[0]);
x2 = Convert.ToInt32(x.Split('_')[1]);
y1 = Convert.ToInt32(y.Split('_')[0]);
y2 = Convert.ToInt32(y.Split('_')[1]);
//compare the first part
if (x1.CompareTo(y1) == 0)
//first parts are equal so compare the second
return x2.CompareTo(y2);
else
return x1.CompareTo(y1);
}
#endregion
}
注意你應該明顯改善MyComparer
類,我只是假設該字符串轉換爲整數等
讓我們知道您到目前爲止嘗試過的。 –