【问题标题】:Sort List by another, incomplete list按另一个不完整的列表排序列表
【发布时间】:2015-02-11 09:02:34
【问题描述】:

好吧,我可能在这里想多了。 我尝试按另一个列表对列表进行排序。只要另一个列表包含列表的所有元素,它就可以正常工作。 如果另一个 List 不完整并且我想将剩余元素保留在 List 的末尾,那么什么是一个好的方法?

这里是一个例子:

public class Column
{
    public int Id;
    public string Name;
    public string Something;
    //...
}

public class Columns : IEnumerable<Column>
{
    private List<Column> columnList = new List<Column>;

    public void SortByName(List<Column> sortedIncompleteList)
    {
            var sorted = from incomplete in sortedIncompleteList
                         join current in columnList
                         on incomplete.FieldName equals current.FieldName 
                         select current;
            columnList = sorted.ToList();
    }
    //...
}

【问题讨论】:

  • 既然您知道如何使用完整列表来完成此操作,请从使用 except 排除缺少的元素开始。然后将这些粘贴到有序列表中。
  • 排序逻辑不清楚。您想通过作为方法参数提供的另一个列表订购columnList?那你为什么不使用order by

标签: c# arrays linq list


【解决方案1】:

也许我过于简单化了,但如果你想排序,为什么不使用OrderBy?您可以使用以下逻辑首先获取两个集合中的项目:

public void SortByName(List<Column> sortedIncompleteList)
{
    columnList = columnList
     .OrderByDescending(c => sortedIncompleteList.Any(c2 => c.FieldName == c2.FieldName))
     .ToList();
}

根据评论更新:“但不是按照它们在sortedIncompleteList中实际出现的顺序”:

public void SortByName(List<Column> sortedIncompleteList)
{
    columnList = columnList
       .OrderBy(c => {
           int index = sortedIncompleteList.FindIndex(c2 => c.FieldName == c2.FieldName);
           if (index == -1) return int.MaxValue;
           return index;
       })
       .ToList();
}

【讨论】:

  • 这不起作用,因为sortedIncompleteList 中包含的元素首先返回,但不是按照它们实际出现在sortedIncompleteList 中的顺序...
  • @BarisAkar:再看看。
【解决方案2】:

我假设您列表中的元素是唯一的,因为 Column 有一个 Id 字段,因为我的解决方案将删除重复项。

public class Columns : IEnumerable<Column>
{
    private List<Column> columnList = new List<Column>;

    public void SortByName(List<Column> sortedIncompleteList)
    {
            columnList = sortedIncompleteList.Intersect(columnList)
                            .Concat(columnList.Except(sortedIncompleteList)).ToList();
    }
    //...
}

Intersect()Concat()Except() 将保留排序...

【讨论】:

    【解决方案3】:

    你可以这样使用:

    var ids = sortedIncompleteList.Select(li => li.Id).ToList();
    
    var ordered = from element in columnList
                  let index = ids.IndexOf(element.Id)
                  orderby index < 0 ? columnList.Count : index
                  select element;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多