按另一个不完整的列表排序列表

时间:2015-02-11 09:02:34

标签: c# arrays linq list

好吧,我可能会在这里讨论一些事情。 我尝试按另一个列表对List进行排序。只要另一个List包含List的所有元素,它就可以正常工作。 如果另一个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();
    }
    //...
}

3 个答案:

答案 0 :(得分:1)

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

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

根据评论更新:&#34;但不按实际出现在sortedIncompleteList&#34;中的顺序排列:

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();
}

答案 1 :(得分:0)

我认为列表中的元素是唯一的,因为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()将保留订购...

答案 2 :(得分:0)

您可以使用以下内容:

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;