Hoe combineer je 2 lijsten met csv-strings en vergelijk je het resultaat met een andere csv

Ik heb de volgende lijst:

List l1 = new List { "A4,A2","A1,A3" };
List l2 = new List { "A5,A6", "A7,A8" };

Ik moet deze 2 combineren en een lijst maken met alle items gescheiden door een komma, dus ik zou eindigen met iets dat bevat:

A4, A2, A1, A3, A5, A6, A7, A8, A9

Ik heb het volgende gebruikt om de 2 lijsten te combineren:

string s1 = string.Join(",", l1.ToArray());
string s2 = string.Join(",", l2.ToArray());

var combinedItems = s1 + "," + s2;

Dan moet ik het resultaat vergelijken met een andere lijst om er zeker van te zijn dat het elementen bevat van A1 tot A8

var allItems = new List { "A1,A2,A3,A4,A5,A6,A7,A8" };

bool allItemsExist = allItems.Any(combinedItems.Contains);

Dit mislukt omdat de volgorde van de combinedItems -variabele niet overeenkomt met de volgorde allItems .

Hoe kan ik de inhoud van combinedItems sorteren of is er een andere manier om te doen wat ik probeer te bereiken?

0

8 antwoord

var items = new[] { l1, l2 }
            .SelectMany(x => x.SelectMany(y => y.Split(',')))
            .OrderBy(y => y);

var allItems = new List 
                        { "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8" };

var result = allItems.SequenceEqual(items);
2
toegevoegd
mooie oplossing :)
toegevoegd de auteur meorfi, de bron
var items = new[] { l1, l2 }
            .SelectMany(x => x.SelectMany(y => y.Split(',')))
            .OrderBy(y => y);

var allItems = new List 
                        { "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8" };

var result = allItems.SequenceEqual(items);
2
toegevoegd
mooie oplossing :)
toegevoegd de auteur meorfi, de bron

brut oplossing:

      List l1 = new List { "A4,A2", "A1,A3" };
      List l2 = new List { "A5,A6", "A7,A8" };

      var s1 = string.Join(",", l1.ToArray());
      var s2 = string.Join(",", l2.ToArray());

      var combinedItems = s1 + "," + s2;
      var splittedAndOrderedCombinedItems = combinedItems.Split(',').OrderBy(x => x).ToList();

      var allItems = new List { "A1,A2,A3,A4,A5,A6,A7,A8" };
      var firstOrDefault = allItems.FirstOrDefault();

      var splittedAllItems = new List();
      if (firstOrDefault != null) {
        splittedAllItems = firstOrDefault.Split(',').ToList();
      }

      var result = splittedAllItems.Any(splittedAndOrderedCombinedItems.Contains);
1
toegevoegd

brut oplossing:

      List l1 = new List { "A4,A2", "A1,A3" };
      List l2 = new List { "A5,A6", "A7,A8" };

      var s1 = string.Join(",", l1.ToArray());
      var s2 = string.Join(",", l2.ToArray());

      var combinedItems = s1 + "," + s2;
      var splittedAndOrderedCombinedItems = combinedItems.Split(',').OrderBy(x => x).ToList();

      var allItems = new List { "A1,A2,A3,A4,A5,A6,A7,A8" };
      var firstOrDefault = allItems.FirstOrDefault();

      var splittedAllItems = new List();
      if (firstOrDefault != null) {
        splittedAllItems = firstOrDefault.Split(',').ToList();
      }

      var result = splittedAllItems.Any(splittedAndOrderedCombinedItems.Contains);
1
toegevoegd

U kunt alle items splitsen:

List l1 = new List { "A4,A2", "A1,A3" }.SelectMany(x => x.Split(',')).ToList();
List l2 = new List { "A5,A6", "A7,A8" }.SelectMany(x => x.Split(',')).ToList();

string combinedItems = string.Join(",", l1.Concat(l2));

List allItems = new List { "A1,A2,A3,A4,A5,A6,A7,A8" }.SelectMany(x => x.Split(',')).ToList();

bool allItemsExist = allItems.All(combinedItems.Contains);
0
toegevoegd

Splits alle strings op hun "A1" "A2" -delen, sorteer ze en voeg zich bij hen.

    List l1 = new List { "A4,A2", "A1,A3" };
    List l2 = new List { "A5,A6", "A7,A8" };
    var result = l1.SelectMany(x => x.Split(',')).Union(l2.SelectMany(x => x.Split(','))).OrderBy(x => x).ToList();
    var str = string.Join("," , result);
    str.Dump();

Output:

A1,A2,A3,A4,A5,A6,A7,A8
0
toegevoegd

Splits alle strings op hun "A1" "A2" -delen, sorteer ze en voeg zich bij hen.

    List l1 = new List { "A4,A2", "A1,A3" };
    List l2 = new List { "A5,A6", "A7,A8" };
    var result = l1.SelectMany(x => x.Split(',')).Union(l2.SelectMany(x => x.Split(','))).OrderBy(x => x).ToList();
    var str = string.Join("," , result);
    str.Dump();

Output:

A1,A2,A3,A4,A5,A6,A7,A8
0
toegevoegd

Snel en vies:

        var allItemsList = allItems.First().Split(',').ToList();
        var combinedItemsList = combinedItems.Split(',').ToList();

        bool allItemsExists = combinedItemsList.All(x => allItemsList.Contains(x)); 

Het heeft geen zin om de door komma's gescheiden reeks op te slaan als één item in een lijst, dus maak er een ECHTE lijst van.

Mijn laatste verklaring bepaalt of elk item (A1-A8) is opgenomen in de allItemsList.

PS: allItemsExists retourneert true in mijn test.

0
toegevoegd