Есть несколько способов.Один из них - написать свой EqualityComparator
и перечислить результат, используя Except
и Intersect
, как показано @Alex в приведенном выше результате, который представляет собой твердый код и также может использоваться повторно , однако, если вы ищетедля быстрых результатов вы можете использовать следующее, используя where
и any
или их комбинации.
Таким образом, чтобы получить результаты, запросы linq будут выглядеть следующим образом:
a) var resultWhereIdsExistsInSourceListButNotOnDestination = sourceList
.Where(l1 => !destinationList.Any(l2 => l2.Id == l1.Id))
.Select(l => l.Id);
b) var resultWhereIdsExistInBothWithDateGreaterInSourceList =
sourceList
.Where(l1 => destinationList.Any(l2 => l2.Id == l1.Id && l1.Date > l2.Date))
.Select(l => l.Id);
c) var combinedResult = resultWhereIdsExistsInSourceListButNotOnDestination
.Union(resultWhereIdsExistInBothWithDateGreaterInSourceList);
Ссылка Fiddle : https://dotnetfiddle.net/AGwFlC#
Примечание: я использовал свои собственные данные выборки.Также просто для использования ForEach
для удобства чтения я использовал .ToList()
для демонстрационных целей.Не нужно каждый раз преобразовывать перечислимое в список.Чисто для демонстрационных целей
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var sourceList = new List<Foo>()
{new Foo()
{Id = 1, Date = DateTime.Now}, new Foo()
{Id = 2, Date = DateTime.Now.AddDays(5)}, new Foo()
{Id = 3, Date = DateTime.Now.AddDays(3)}, new Foo()
{Id = 4, Date = DateTime.Now}, new Foo()
{Id = 5, Date = DateTime.Now}};
var destinationList = new List<Foo>()
{new Foo()
{Id = 2, Date = DateTime.Now}, new Foo()
{Id = 3, Date = DateTime.Now}, new Foo()
{Id = 4, Date = DateTime.Now}, new Foo()
};
Console.WriteLine("--IDs IN SOURCE LIST BUT NOT IN DESTINATION--------");
var resultWhereIdsExistsInSourceListButNotOnDestination =
sourceList
.Where(l1 => !destinationList.Any(l2 => l2.Id == l1.Id)).Select(l => l.Id).ToList();
resultWhereIdsExistsInSourceListButNotOnDestination.ForEach(r => Console.WriteLine(r));
Console.WriteLine("--IDs IN BOTH WHERE THE DATE IN SOURCE LIST IS GREATER--------");
var resultWhereIdsExistInBothWithDateGreaterInSourceList = sourceList
.Where(l1 => destinationList.Any(l2 => l2.Id == l1.Id && l1.Date > l2.Date)).Select(l => l.Id).ToList();
resultWhereIdsExistInBothWithDateGreaterInSourceList.ForEach(r => Console.WriteLine(r));
Console.WriteLine("------------------ UNINON-------------------------------------");
resultWhereIdsExistsInSourceListButNotOnDestination
.Union(resultWhereIdsExistInBothWithDateGreaterInSourceList).ToList().ForEach(r => Console.WriteLine(r));
}
}
public class Foo
{
public DateTime Date
{
get;
set;
}
public int Id
{
get;
set;
}
}
;