2013-06-08 3 views
2

У меня есть список содержит элементы интерфейса IGrid (я его создал)отдельный список на несколько списков, основанных на собственности

public interface IGrid 
{ 
    RowIndex { get; set; } 
    ColumnIndex { get; set; } 
} 

, и я хочу, чтобы создать метод, который отделяет Список в нескольких списках List>

основан на свойстве RowIndex

так что я написал:

public List<List<IGrid>> Separat(List<IGrid> source) 
{ 
    List<List<IGrid>> grid = new List<List<IGrid>>(); 
    int max= source.Max(c => c.RowIndex); 
    int min = source.Min(c => c.RowIndex); 

    for (int i = min; i <= max; i++) 
    { 
      var item = source.Where(c => c.RowIndex == i).ToList(); 
      if (item.Count > 0) 
       grid.Add(item); 
      } 
      return grid; 
    } 
} 

Что такое лучший способ сделать это?

ответ

4

Да, вы можете сделать это с помощью LINQ в одном операторе:

public List<List<IGrid>> Separat(List<IGrid> source) { 
    return source 
     .GroupBy(s => s.RowIndex) 
     .OrderBy(g => g.Key) 
     .Select(g => g.ToList()) 
     .ToList(); 
} 

Если вы не заботитесь о том, что списки отображаются в порядке возрастания RowIndex, таким образом, что ваш метод производит их, вы можете удалите вызов метода OrderBy из цепочки вызовов метода.

+0

Какова сложность этого утверждения? Это будет взорваться, если у меня будут большие списки? –

+1

@DanB Это не слишком дорого - самым дорогим является «OrderBy», который является O (n * log n) в худшем случае (когда группы имеют размер 1). Группировочная часть - O (n). – dasblinkenlight

Смежные вопросы