Seleziona distinto da due proprietà in un elenco

Ho una list che contiene le proprietà di tipo Guid e DateTime (così come altre proprietà). Mi piacerebbe sbarazzarsi di tutti gli elementi in quella lista in cui Guid e DateTime sono gli stessi (tranne uno). Ci saranno volte in cui queste due proprietà saranno uguali ad altre voci nella lista, ma le altre proprietà saranno diverse, quindi non posso semplicemente usare .Distinct()

 List messages = GetList(); //The list now contains many objects, it is ordered by the DateTime property messages = from p in messages.Distinct( what goes here? ); 

Questo è quello che ho adesso, ma sembra che ci dovrebbe essere un modo migliore

 List messages = GetList(); for(int i = 0; i < messages.Count() - 1) //use Messages.Count() -1 because the last one has nothing after it to compare to { if(messages[i].id == messages[i+1}.id && messages[i].date == message[i+1].date) { messages.RemoveAt(i+1); { else { i++ } } 

LINQ to Objects non fornisce questa funzionalità facilmente in modo integrato, ma MoreLINQ ha un pratico metodo DistinctBy :

 messages = messages.DistinctBy(m => new { m.id, m.date }).ToList(); 

DistinctBy Jon Skeet è sicuramente la strada da percorrere, tuttavia se sei interessato a definire il tuo metodo di estensione potresti prendere in considerazione questa versione più concisa:

 public static IEnumerable DistinctBy (this IEnumerable source, Func keySelector) { var known = new HashSet(); return source.Where(element => known.Add(keySelector(element))); } 

che ha la stessa firma:

 messages = messages.DistinctBy(x => new { x.id, x.date }).ToList(); 

Che dire di questo?

 var messages = messages .GroupBy(m => m.id) .GroupBy(m => m.date) .Select(m => m.First()); 

Puoi controllare la mia libreria PowerfulExtensions . Attualmente è in una fase molto giovane, ma già puoi usare metodi come Distinct, Union, Intersect, Tranne su un numero qualsiasi di proprietà;

Ecco come lo usi:

 using PowerfulExtensions.Linq; ... var distinct = myArray.Distinct(x => xA, x => xB); 

Prova questo,

  var messages = (from g1 in messages.GroupBy(s => s.id) from g2 in g1.GroupBy(s => s.date) select g2.First()).ToList();