C # порівняння колекцій

I'm new to C# and need some help with comparing collections. I have two List collections with their contents as below:

Колекція "Старе": ("AAA", "BBB", "CCC")

Колекція Нова: ("BBB", "CCC", "DDD")

Я хочу отримати таку колекцію:

Колекція фіналу: ("AAA", "Видалити"; "BBB", "Keep"; "CCC", "Keep"; "DDD", "Додати"}

Як це зробити?

3
чи варто читати ("AAA", "Видалити", "BBB", "Видалити", "CCC", "Видалити", "DDD", "Додати")
додано Автор Woot4Moo, джерело
Як ви бачите "AAA" та "Видалити" , згруповані разом? Кортежі? KeyValuePair ? Тільки один, хто йде за іншим?
додано Автор Dan Abramov, джерело
Ви тільки дбаєте про те, що додано, видалено та зберігається? Ви не дбаєте про зміни у замовленні?
додано Автор Joe White, джерело
@ Woot4Moo, це не має ніякого сенсу. BBB та CCC не були вилучені - вони все ще там в Collection New.
додано Автор Joe White, джерело

5 Відповіді

old.Except(new) will give you those items to remove

new.Except(old) will give you items to add

old.Intersect(new) will give you items to keep

(Це припускає, що ви не проти, використовуючи простір імен System.Linq)

Або, якщо ви віддаєте перевагу, ви можете розглянути кожен елемент окремо та перевірити наявність у кожному списку

8
додано
            var oldList = new List() {"AAA", "BBB", "CCC"};
            var newList = new List() {"BBB", "CCC", "DDD"};

            var diffDictionary = new Dictionary();

            foreach (var oldEntry in oldList)
            {
                diffDictionary.Add(oldEntry, "Remove");
            }

            foreach (var newEntry in newList)
            {
                if (diffDictionary.ContainsKey(newEntry))
                {
                    diffDictionary[newEntry] = "Keep";
                }
                else
                {
                    diffDictionary.Add(newEntry, "Add");
                }
            }

            foreach (var dDico in diffDictionary)
            {
                Console.WriteLine(string.Concat("Key: ", dDico.Key, " Value: ", dDico.Value));
            }
1
додано
Хороший алгоритм, мені це подобається.
додано Автор Başar Kaya, джерело

Якщо у вас є цей метод

public static IEnumerable Concat(params IEnumerable[] sequences)
{
    return sequences.SelectMany(x => x);
}

ти повинен вміти писати:

static readonly string Remove = "Remove";
static readonly string Keep = "Keep";
static readonly string Add = "Add";

var result = Concat
(
    old.Except(new).Select(x => new { x, Remove }), 
    old.Intersect(new).Select(x => new { x, Keep }), 
    new.Except(old).Select(x => new { x, Add })
);

Звичайно, ви можете використовувати вбудований метод Enumerable.Concat , але я вважаю, що мій елегантний.

0
додано

У 1 рядку (сорт)!

string[] colOld = {"AAA","BBB","CCC"};
string[] colNew = {"BBB","CCC","DDD"};

dynamic colALL = (from o in colOld.Union(colNew)
                  select new {Value = o, Action = 
                              colOld.Any(s => s == o) ? 
                                  colNew.Any(s => s == o) ? "Keep" : "Remove" 
                              : "Add"
                           }).ToList();

Примітка: це конверсія збудування для розробників, яка працює нижче - vb.net, я не мав змоги протестувати версію c #:

 Dim colOld() As String = {"AAA", "BBB", "CCC"}
    Dim colNew() As String = {"BBB", "CCC", "DDD"}

    Dim colALL = (From o As String In colOld.Union(colNew) _
                    Select New With {.Value = o, .Action = _
                                     If(colOld.Any(Function(s) s = o), _
                                        If(colNew.Any(Function(s) s = o), "Keep", "Remove"), _
                                        "Add")}).ToList
0
додано

Ви можете використовувати словник для цього ...

в кінці кожного елемента в словнику буде повідомлено, скільки елементів кожного виду було видалено або додано.

Це позначатиме це за допомогою графа, а не простого прапору держави ... це тому, що ви, можливо, додали або видалили повторювані елементи ... що робити, якщо ви вставите 3 AAA у другу колекцію .

        string[] col1 = new string[] { "AAA", "BBB", "CCC" };
        string[] col2 = new string[] { "BBB", "CCC", "DDD" };

        Dictionary colDic = new Dictionary();
        foreach (var item in col1)
        {
            int num;
            if (colDic.TryGetValue(item, out num))
                colDic[item] = num - 1;
            else
                colDic[item] = -1;
        }

        foreach (var item in col2)
        {
            int num;
            if (colDic.TryGetValue(item, out num))
                colDic[item] = num + 1;
            else
                colDic[item] = 1;
        }

Кінцевий результат виглядатиме так:

AAA = -1
BBB = 0
CCC = 0
DDD = 1
0
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug