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;