Жинақтарды салыстыру 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
«ААА», «Жою», «ВВВ», «Жою», «CCC», «Жою», «DDD», «Қосу»
қосылды автор Woot4Moo, көзі
«AAA» және «Remove» дегенді қалай топтауға болады? Бума? KeyValuePair s? Біреудің артынан біреу келе ме?
қосылды автор Dan Abramov, көзі
Қосылған, жойылған және сақталған нәрселерге тек қамқорлық жасайсыз ба? Сіз тәртіптегі өзгерістер туралы ойламайсыз ба?
қосылды автор Joe White, көзі
@ Woot4Moo, бұл мағынасы жоқ. BBB және CCC жойылмады - олар жаңа коллекцияда.
қосылды автор 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
қосылды