【问题标题】:Sort list by order of another one inocomplete and modified list按另一个不完整和修改列表的顺序对列表进行排序
【发布时间】:2016-04-20 15:43:22
【问题描述】:

我有两个列表,其中一个是另一个的子集修改子集。例如:

List<string> list1 = new List<string>(){ "A1", "A2", "A3" };
List<string> list2 = new List<string>() { "AA2", "B1", "B2", "AA1", "B3", "AA2" };

我想对第二个列表进行排序,使其具有与第一个相似的顺序,如下所示:

List<string> list2 = new List<string>() { "AA1", "AA2", "AA3", "B1", "B2", "B3" };

我怎样才能做到这一点?

【问题讨论】:

  • 项目是如何修改的?
  • 为了做到这一点,必须更好地定义“相似顺序”......规则是什么?
  • 从列表的角度来看,您的第二个列表不是第一个列表的“子集”。这些条目有点像第一个,但它们不是一个子集。在您的示例中,您需要某种逻辑才能知道 AA1 是“A1”定义的“子集”。然后,您可以遍历第一个列表并找到以某种方式属于每个项目子集的项目,并按该顺序创建一个新列表。

标签: c# list sorting


【解决方案1】:

假设list1 项目是list2 项目的子集(子字符串),您可以使用Linqstring 函数执行类似的操作。我不确定它是最佳的,但可以工作。欢迎提出建议以改进答案。

想法是找到list1项目对应的List2项目的索引(如果没有找到项目则最大索引),然后Sort基于字符串/项目索引ThenBy

    List<string> list1 = new List<string>(){ "A1", "A2", "A3" };
    List<string> list2 = new List<string>() { "AA2", "B1", "B3", "AA1", "B2", "AA3" };


    var results = list2.Select(s=> 
    {
        var ind = list1.IndexOf(list1.Find(f=> s.Contains(f)));

        return new 
        { 
            index= ind==-1? int.MaxValue : ind, // assign max value if item is not found to place in the end in order. 
            item =s 
        };

    }).OrderBy(o=>o.index).ThenBy(o=>o.item).Select(s=>s.item); 

输出

AA1
AA2
AA3
B1
B2
B3

查看Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2019-07-30
    • 2018-01-03
    • 1970-01-01
    • 2022-11-16
    • 2018-09-15
    相关资源
    最近更新 更多