2015-02-11 4 views
1

Хорошо, я могу что-то переуторить. Я пытаюсь сортировать список по другому списку. Это работает отлично, пока другой список содержит все элементы 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

+0

Логика сортировки не ясна. Вы хотите заказать 'columnList' другим списком, который предоставляется как аргумент метода? Так почему бы вам не использовать «порядок»? –

ответ

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' ... –

+0

@BarisAkar: посмотрите еще раз. –

+0

, который должен работать ... –

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() сохранит порядок ...

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; 
Смежные вопросы