2010-10-19 18 views
6

Benim özel örneğim oldukça karmaşıktır, ancak konseptin bir kayıt sistemi gibi bir şeye eşit şekilde uygulanacağını düşünüyorum, bunun yerine bunu açıklama kolaylığı için kullanacağım. Bu bir ficticious örnek, üzerinde durmak veya achitectually ne üzerinde tereddüde düşerler, programlama yoluyla veya örneğin kendisi :) LINQ: Distinct/GroupBy ile IEnumerable arasından seçim yapın ve sıralama yapın - mümkün mü?

bunun sende Say ile ahlaken yanlış etmeyiniz:

class LogEntry 
{ 
    int ID; 
    int UserName; 
    datetime TimeStamp; 
    string Details; 
} 

ve bir dizi çekti böyle verilerin: ne yapmak istediğiniz her kullanıcı (yani GroupBy adı) için sadece son tek kaydı (TimeStamp Azalan üzerinde yani sırala) seçim'dir

ID Username Timestamp Details 
1 foo  1/01/2010 Account created 
2 zip  2/02/2010 Account created 
3 bar  2/02/2010 Account created 
4 sandwich 3/03/2010 Account created 
5 bar  5/05/2010 Stole food 
6 foo  5/05/2010 Can't find food 
7 sandwich 8/08/2010 Donated food 
8 sandwich 9/09/2010 Ate more food 
9 foo  9/09/2010 Ate food 
10 bar  11/11/2010 Can't find food 

. Kafamı Distinct ve daha az ölçüde GroupBy'ye getirebilirim, fakat bunların hepsini tek bir ifadeyle birleştirerek tekil olmayan/gruplanmış alanları/özellikleri döndürür ve zaman damgasına göre sıralar bana başım ağrıyor. Yukarıdaki örnekte ile çıkıp gerekenler

geçerli:

ID Username Timestamp Details 
2 zip  2/02/2010 Account created 
8 sandwich 9/09/2010 Ate more food 
9 foo  9/09/2010 Ate food 
10 bar  11/11/2010 Can't find food 
performansı burada ve ben kritik olmadığı zaman ben 'hile' ve bunu yaparken bir çok uzatan bir şekilde başvurmak istemiyoruz

Tek bir LINQ ifadesinde yapılabileceğinden eminim. Senin Örneğin tamamen aynı çıktıyı verir =)

var results = sourceList 
    .OrderByDescending(item => item.Timestamp) 
    .GroupBy(item => item.Username) 
    .Select(grp => grp.First()) 
    .ToArray(); 

Bu örnek kod, verileri kullanarak, ve kimliğine göre nihai sipariş:

+0

Son sıralamanın nasıl olmasını istersiniz? – Will

cevap

14

Umarım benim Linq fu Bu sefer doğru (eğer don ham biçimlendirmeyi aklınızda tutun!)

class Program 
{ 
    static void Main(string[] args) 
    { 
     var sourceItems = new[] { 
      new LogEntry {ID=1 ,UserName="foo  ", TimeStamp= new DateTime(2010 ,1,01),Details="Account created ",} , 
      new LogEntry {ID=2 ,UserName="zip  ", TimeStamp= new DateTime(2010 ,2,02),Details="Account created ",} , 
      new LogEntry {ID=3 ,UserName="bar  ", TimeStamp= new DateTime(2010 ,2,02),Details="Account created ",} , 
      new LogEntry {ID=4 ,UserName="sandwich ", TimeStamp= new DateTime(2010 ,3,03),Details="Account created ",} , 
      new LogEntry {ID=5 ,UserName="bar  ", TimeStamp= new DateTime(2010 ,5,05),Details="Stole food  ",} , 
      new LogEntry {ID=6 ,UserName="foo  ", TimeStamp= new DateTime(2010 ,5,05),Details="Can't find food ",} , 
      new LogEntry {ID=7 ,UserName="sandwich ", TimeStamp= new DateTime(2010 ,8,08),Details="Donated food ",} , 
      new LogEntry {ID=8 ,UserName="sandwich ", TimeStamp= new DateTime(2010 ,9,09),Details="Ate more food ",} , 
      new LogEntry {ID=9 ,UserName="foo  ", TimeStamp= new DateTime(2010 ,9,09),Details="Ate food  ",} , 
      new LogEntry {ID=10 ,UserName="bar  ", TimeStamp= new DateTime(2010,11,11),Details="Can't find food ",} , 
     }; 

     var results = sourceItems 
      .OrderByDescending(item => item.TimeStamp) 
      .GroupBy(item => item.UserName) 
      .Select(grp => grp.First()) 
      .OrderBy(item=> item.ID) 
      .ToArray(); 

     foreach (var item in results) 
     { 
      Console.WriteLine("{0} {1} {2} {3}", 
       item.ID, item.UserName, item.TimeStamp, item.Details); 
     } 
     Console.ReadKey(); 
    } 
} 


public class LogEntry 
{ 
    public int ID; 
    public string UserName; 
    public DateTime TimeStamp; 
    public string Details; 
} 
+0

Bana iyi görünüyor. Her ne kadar sonunda 'ID' ile sıralanıyor gibi görünüyor. –

+0

Açıklama! Teşekkürler. Aşırı nathanchere

+0

@Jeff: Şerefe - OP'den bu noktayı açıklamasını istedim. – Will

İlgili konular