it-swarm.com.de

Wählen Sie zwei Eigenschaften in einer Liste aus

Ich habe einen list<message>, der Eigenschaften des Typs Guid und DateTime (sowie andere Eigenschaften) enthält. Ich möchte alle Elemente in dieser Liste entfernen, bei denen Guid und DateTime gleich sind (mit Ausnahme eines). Es kann vorkommen, dass diese beiden Eigenschaften mit den anderen Elementen in der Liste identisch sind. Die anderen Eigenschaften unterscheiden sich jedoch. Daher kann ich nicht einfach .Distinct() verwenden.

List<Message> messages = GetList();
//The list now contains many objects, it is ordered by the DateTime property

messages = from p in messages.Distinct(  what goes here? ); 

Das habe ich jetzt, aber es scheint, dass es einen besseren Weg geben sollte

List<Message> 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++
    }
}
22
user1304444

LINQ to Objects bietet diese Funktionalität nicht ohne weiteres, aber MoreLINQ hat eine praktische DistinctBy-Methode:

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

Jon Skeets DistinctBy ist definitiv der richtige Weg. Wenn Sie jedoch daran interessiert sind, Ihre eigene Erweiterungsmethode zu definieren, können Sie sich an dieser etwas präziseren Version orientieren:

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

welches die gleiche Signatur hat:

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

Was ist damit?

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

Versuche dies,

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

Sie können meine PowerfulExtensions -Bibliothek auschecken. Derzeit befindet es sich noch in einem sehr jungen Stadium, aber Sie können bereits Methoden wie Distinct, Union, Intersect, Except bei einer beliebigen Anzahl von Eigenschaften verwenden.

So verwenden Sie es:

using PowerfulExtensions.Linq;
...
var distinct = myArray.Distinct(x => x.A, x => x.B);
1
Andrzej Gis