Подтвердить что ты не робот

Выберите выделение по двум свойствам в списке

У меня есть list<message>, который содержит свойства типа Guid и DateTime (а также другие свойства). Я хотел бы избавиться от всех элементов в этом списке, где Guid и DateTime одинаковы (кроме одного). Будут моменты, когда эти два свойства будут такими же, как и другие элементы в списке, но другие свойства будут разными, поэтому я не могу просто использовать .Distinct()

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? ); 

Это то, что я имею прямо сейчас, но кажется, что должен быть лучший способ

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++
    }
}
4b9b3361

Ответ 1

LINQ to Objects не предоставляет эту функциональность легко встроенным способом, но у MoreLINQ есть удобный метод DistinctBy:

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

Ответ 2

Jon Skeet DistinctBy - это, безусловно, путь, однако, если вы заинтересованы в определении своего собственного метода расширения, вы можете подумать об этой более сжатой версии:

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)));
}

который имеет одну и ту же подпись:

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

Ответ 3

Как насчет этого?

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

Ответ 4

Вы можете проверить мою библиотеку PowerfulExtensions. В настоящее время он находится на очень молодой стадии, но уже вы можете использовать такие методы, как Distinct, Union, Intersect, за исключением любого количества свойств;

Вот как вы его используете:

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

Ответ 5

Попробуй это,

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

Ответ 6

MoreLinq, такие как John Skeet и другие, о которых упоминают другие, является отличным вариантом использования Distinct By.