【问题标题】:Composite sort in List<string> C# [closed]List<string> C#中的复合排序[关闭]
【发布时间】:2014-10-27 21:50:32
【问题描述】:

朋友们,我有一个这样的列表:

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"  
};

我需要以这样的方式对这些列表进行排序以获得以下顺序:

149_1
149_2
150_1_A
150_2_A
150_A_1
150_A_1_A

有什么想法吗?谢谢

【问题讨论】:

  • 使用.Sort()方法这里已经回答了问题Link
  • 150_A_2 项目在此顺序中的位置?
  • 或项目150_10_A? (我猜你的例子并不是问题的全部代表。)
  • 在你的情况下:60_1 会在 100_1 之前......对吗?

标签: c# sorting tlist


【解决方案1】:

她的 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);

首先我用'_'分割字符串

然后我对第一个字段进行数字排序。

最后我按字母顺序对所有剩余字段进行排序

【讨论】:

    【解决方案2】:

    filenames.Sort(); 完全符合您的要求

    如果你想要延迟执行,你可以这样做: filenames.OrderBy(s =&gt; s);

    【讨论】:

    • @ChrisEelmaa 解释为什么这不是他想要的?输出与他的样本输出完美匹配
    • 我在否决之前尝试了 filenames.Sort()。它给了我“150_A_2”作为最后一项,但这不是 OP 想要的吗?
    • @ChrisEelmaa 有人会认为这是他的输出中的一个缺点,除非我们被引导相信存在一种名为 .SortExceptWhereElementEquals150_A_2() 的算法
    • 仍然是一个不完整的问题无法真正得到答案。
    • 点了,删除了downvote。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    相关资源
    最近更新 更多