C # сравнивая коллекции - PullRequest
       1

C # сравнивая коллекции

3 голосов
/ 28 октября 2011

Я новичок в C # и мне нужна помощь в сравнении коллекций.У меня есть две List<string> коллекции с содержанием ниже:

Коллекция Old: {"AAA", "BBB", "CCC"}

Коллекция New: {"BBB", "CCC "," DDD "}

Я хочу получить коллекцию, как показано ниже:

Финал коллекции: {" AAA "," Remove ";"BBB", "Keep";"CCC", "Keep";"DDD", "Добавить"}

Как я могу это сделать?

Ответы [ 5 ]

8 голосов
/ 28 октября 2011

old.Except(new) даст вам предметы для удаления

new.Except(old) даст вам вещи для добавления

old.Intersect(new) даст вам вещи для хранения

(Предполагается, что вы не против использовать пространство имен System.Linq)

Или, если хотите, вы можете рассмотреть каждый элемент в отдельности и проверить наличие в каждом списке

1 голос
/ 28 октября 2011
            var oldList = new List<String>() {"AAA", "BBB", "CCC"};
            var newList = new List<String>() {"BBB", "CCC", "DDD"};

            var diffDictionary = new Dictionary<string, string>();

            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));
            }
0 голосов
/ 30 июня 2015

Если у вас есть этот метод

public static IEnumerable<T> Concat<T>(params IEnumerable<T>[] 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 голосов
/ 28 октября 2011

В 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 голосов
/ 28 октября 2011

Вы можете использовать словарь, чтобы сделать это ...

В конце каждый элемент в словаре сообщит вам, сколько элементов каждого вида было удалено или добавлено.

Это будет указано с помощью счетчика, а не простого флага с 3 состояниями ... потому что вы, возможно, добавили или удалили повторяющиеся элементы ... что если вы вставите 3 AAA во второй набор.

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

        Dictionary<string, int> colDic = new Dictionary<string, int>();
        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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...