2015-02-11 86 views
1

好吧我可能会在这里过度点东西。 我尝试按另一个列表对列表进行排序。只要另一个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(); 
    } 
    //... 
} 
+0

,因为你知道如何使用完整的清单做,以排除启动除了缺少的元素。然后,将这些粘贴到有序列表中。 – ne2dmar 2015-02-11 09:13:59

+0

排序逻辑不清楚。你想通过作为方法参数提供的另一个列表来订购'columnList'?那么你为什么不使用'order by'? – 2015-02-11 09:19:12

回答

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

这不起作用,因为'sortedIncompleteList'中包含的元素首先被返回,但不是它们实际出现在'sortedIncompleteList'中的顺序... – 2015-02-11 10:57:07

+0

@BarisAkar:再次看看。 – 2015-02-11 11:00:59

+0

应该工作... – 2015-02-11 12:42:03

0

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

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()将保留排序...

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;