请找到他附加的图像。 基于字典中的键排序
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
类,我只是假设该字符串转换为整数等
让我们知道您到目前为止尝试过的。 –