2013-05-18 5 views
0

Использование Asp.Net 4.0/C#Можно ли объединить эти 2 заявления с помощью linq?

У меня есть список предметов. Список содержит дубликаты.

Это класс вещь:

public class PingtreeNode 
{ 
    public int TierId { get; set; } 
    public int LenderId { get; set; } 
    public int Weight { get; set; } 
    public int Seq { get; set; } 

    public PingtreeNode(int tierId, int lenderId, int weight, int seq) 
    { 

     TierId = tierId; 
     LenderId = lenderId; 
     Weight = weight; 
     Seq = seq; 
    } 
} 

В первую очередь я хочу, чтобы выбрать первый элемент для каждого LenderId. Я так с помощью этого LINQ:

var tierNodes = new List<PingtreeNode>();  
tierNodes = tierNodes.GroupBy(x => x.LenderId).Select(x => x.First()).ToList(); 

Однако, я также хочу, чтобы добавить последовательность в список, начиная с 1,2,3 и т.д. Я в настоящее время сделать это отдельно, обернув через так:

  int seq = 1; 
      foreach (var t in tierNodes) 
      { 
       t.Seq = seq; 
       seq++; 
      } 

Возможна ли как групповая, так и последовательность в одно и то же время с использованием одного оператора linq?

ответ

3
int seq = 1; 
var tierNodes = new List<PingtreeNode>();  
tierNodes = tierNodes 
    .GroupBy(x => x.LenderId) 
    .Select(x => { var y = x.First(); y.Seq = seq++; return y; }) 
    .ToList(); 
+0

Knagis - спасибо отлично – dotnetnoob

1

Некоторые методы перечислимых параметров имеют индексный параметр для функции селектора. Один из них - Select.

Вы можете использовать этот параметр индекса для пошагового номера:

var tierNodes = new List<PingtreeNode>();  
tierNodes = tierNodes 
    .GroupBy(x => x.LenderId) 
    .Select((x, i) => { var y = x.First(); y.Seq = i + 1; return y; }) 
    .ToList(); 

Это даст вам перечислимые независимый от какого-либо внешнего переменных, таким образом, будучи идемпотент, и без каких-либо замыканий.

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