Как уже упоминалось, вам нужен синтаксический анализатор C для Java - посмотрите на этот ответ: Проект Eclipse CDT
Операция, которая действительно подходит для этой цели, - это полное внешнее соединение . Класс Enumerable
имеет реализацию внутреннего соединения, которое можно использовать для поиска дубликатов и выбора того, что вы предпочитаете.
var duplicates = Enumerable.Join(tempList1, tempList2, keySelector, keySelector,
(item1, item2) => (item1.SomeDate > item2.SomeDate) ? item1 : item2)
.ToList();
keySelector
- это просто функция (может быть лямбда-выражением), которая извлекает ключ от объекта типа SomeDetail
. Теперь, чтобы реализовать полное внешнее соединение, попробуйте что-то вроде этого:
var keyComparer = (SomeDetail item) => new { Value1 = item.SomeValue1,
Value2 = item.SomeDetail2 };
var detailList = Enumerable.Union(tempList1.Except(tempList2, equalityComparer),
tempList2.Except(tempList1, equalityComparer)).Union(
Enumerable.Join(tempList1, tempList2, keyComparer, keyComparer
(item1, item2) => (item1.SomeDate > item2.SomeDate) ? item1 : item2))
.ToList();
equalComparer
должен быть объектом, который реализует IEqualityComparer
и эффективно использует функцию keyComparer
для проверка равенства.
Дайте мне знать, поможет ли это вам.
Вы не можете использовать стандартный метод Union
, но можете создать метод расширения Union
для List
с помощью эта особая обработка и этот метод будут использоваться, потому что подпись подходит лучше.
Вы должны указать Union, как выбрать, какой из дубликатов использовать. Я не знаю другого способа сделать это, кроме как написать свой собственный Союз.
Почему бы просто не использовать HashSet
List<SomeDetail> tempList1 = new List<SomeDetail>();
List<SomeDetail> tempList2 = new List<SomeDetail>();
HashSet<SomeDetail> hs = new HashSet<SomeDetail>(new SomeDetailComparer());
hs.UnionWith(tempList1);
hs.UnionWith(tempList2);
List<SomeDetail> detailList = hs.ToList();
Объединить общие списки
public static List<T> MergeListCollections<T>(List<T> firstList, List<T> secondList)
{
List<T> merged = new List<T>(firstList);
merged.AddRange(secondList);
return merged;
}