C# универсальный вопрос об объединении списка

Как уже упоминалось, вам нужен синтаксический анализатор C для Java - посмотрите на этот ответ: Проект Eclipse CDT

8
задан Daniel Brückner 11 May 2009 в 19:08
поделиться

5 ответов

Операция, которая действительно подходит для этой цели, - это полное внешнее соединение . Класс 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 для проверка равенства.

Дайте мне знать, поможет ли это вам.

8
ответ дан 5 December 2019 в 17:40
поделиться

Вы не можете использовать стандартный метод Union , но можете создать метод расширения Union для List с помощью эта особая обработка и этот метод будут использоваться, потому что подпись подходит лучше.

1
ответ дан 5 December 2019 в 17:40
поделиться

Вы должны указать Union, как выбрать, какой из дубликатов использовать. Я не знаю другого способа сделать это, кроме как написать свой собственный Союз.

1
ответ дан 5 December 2019 в 17:40
поделиться

Почему бы просто не использовать 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();
1
ответ дан 5 December 2019 в 17:40
поделиться

Объединить общие списки

    public static List<T> MergeListCollections<T>(List<T> firstList, List<T> secondList)
    {
        List<T> merged = new List<T>(firstList);
        merged.AddRange(secondList);
        return merged;
    }
0
ответ дан 5 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: