列表中的复合排序<;字符串>;C#
朋友们,我有这样一个清单:列表中的复合排序<;字符串>;C#,c#,sorting,tlist,C#,Sorting,Tlist,朋友们,我有这样一个清单: var filenames = new List<string> { "150_A_1_A", "150_A_1", "149_2", "149_1", "150_1_A", "150_A_2", "150_2_A" }; 有什么想法吗?谢谢文件名.Sort()完全符合您的要求 如果希望延迟执行,可以执行以下操作: filenames.OrderBy(s=>s)她的LI
var filenames = new List<string>
{
"150_A_1_A",
"150_A_1",
"149_2",
"149_1",
"150_1_A",
"150_A_2",
"150_2_A"
};
有什么想法吗?谢谢文件名.Sort()代码>完全符合您的要求
如果希望延迟执行,可以执行以下操作:
filenames.OrderBy(s=>s)代码>她的LINQ表达式可以满足您的需要:
var x = filenames.Select(s => new { value = s, splitted = s.Split('_') }).OrderBy(s => int.Parse(s.splitted[0]));
for (int i = 1; i < x.Max(s => s.splitted.Length); i++)
{
var thisI = i;
x = x.ThenBy(s => thisI >= s.splitted.Length ? null : s.splitted[thisI]);
}
var sorted = x.Select(s => s.value);
var x=filenames.Select(s=>new{value=s,splitted=s.Split('''')).OrderBy(s=>int.Parse(s.splitted[0]);
对于(inti=1;is.splitted.Length);i++)
{
var thisI=i;
x=x.ThenBy(s=>thisI>=s.splitted.Length?null:s.splitted[thisI]);
}
var sorted=x.Select(s=>s.value);
首先,我用“\u1”分割字符串
然后我对第一个字段进行数字排序
最后,我使用.sort()
方法按字母顺序对所有剩余字段进行排序,这里已经回答了以下问题:150\u A\u 2
项目将按此顺序排列?还是项目150\u 10\u A
?(我猜你的例子并不是问题的全部代表。)在你的例子中:60_1将在100_1之前出现。。。对吗?@ChrisEelmaa解释为什么不是他想要的?输出与他的示例输出完全匹配。在我投票否决之前,我尝试了filenames.Sort()。它给了我“150_A_2”作为最后一项,但这不是OP想要的吗?@ChrisEelmaa一个人会认为这是他的输出中的一个缺陷,除非我们相信有一个名为的算法。SortExceptWhereElementEquals150_A_2()
仍然是一个不完整的问题不能真正得到答案。要点,删除向下投票。
var x = filenames.Select(s => new { value = s, splitted = s.Split('_') }).OrderBy(s => int.Parse(s.splitted[0]));
for (int i = 1; i < x.Max(s => s.splitted.Length); i++)
{
var thisI = i;
x = x.ThenBy(s => thisI >= s.splitted.Length ? null : s.splitted[thisI]);
}
var sorted = x.Select(s => s.value);