C # Linq Проверить, находится ли список в списке списка - PullRequest
0 голосов
/ 01 марта 2019

У меня есть два списка списков:
(1) варианты и (2) параметры .

Мне нужно посмотреть, существует ли ВСЕ опции внутри вариантов (независимо от порядка).

Например: в приведенном ниже коде мне нужно убедиться, что каждый список элементов отображается в списке вариантов - поэтому список «синий», «красный» и «зеленый» должен появляться в списке вариантов независимо от порядка

РЕДАКТИРОВАТЬ (уточнение): Все списки внутри «параметров» должны появляться в «вариантах».Если один из них дает сбой, тогда логическое значение должно возвращать false.

Я установил условие LINQ, но я не уверен, почему оно не работает.Любая помощь будет оценена.

 //TEST 1

    List<List<string>> variants = new List<List<string>>();
    variants.Add(new List<string> {"cars", "boats", "planes"});
    variants.Add(new List<string> {"money", "trees", "plants"});
    variants.Add(new List<string> {"green", "blue", "red" });
    variants.Add(new List<string> {"kid", "adult", "senior"});
    variants.Add(new List<string> {"tax", "insurance", "salary"});

    List<List<string>> options = new List<List<string>>();
    options.Add(new List<string> { "senior", "adult", "kid" });
    options.Add(new List<string> { "blue", "red", "green"});
    options.Add(new List<string> {"money", "trees", "plants"});

    bool exists = variants.Any(a => options.Any(b => b.SequenceEqual(a.OrderBy(x => x))));

    Console.WriteLine(exists);
    // The result should be TRUE even though the order of "senior", "adult" and "kid"
    // is different and that the order of listed items is different


 //TEST 2
    List<List<string>> options2 = new List<List<string>>();
    options2.Add(new List<string> { "senior", "adult", "kid" });
    options2.Add(new List<string> { "orange", "red", "green"});
    options2.Add(new List<string> {"money", "trees", "plants"});

    exists = variants.Any(a => options2.Any(b => b.SequenceEqual(a.OrderBy(x => x))));

    Console.WriteLine(exists);
    // The result should be FALSE. All listed options are TRUE except that the 2nd list has
    // "orange" which doesn't appear in the variants list.



 //TEST 3
    List<List<string>> options3 = new List<List<string>>();
    options3.Add(new List<string> { "senior", "red", "adult" });
    options3.Add(new List<string> { "blue", "kid", "green"});
    options3.Add(new List<string> {"money", "trees", "plants"});

    exists = variants.Any(a => options3.Any(b => b.SequenceEqual(a.OrderBy(x => x))));

    Console.WriteLine(exists);
    // The result should be FALSE. All of the items actually exist in the variant list, 
    // but "senior", "kid", and "adult" do not appear together within a list of variants.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Пока ваш код работает, но оба списка должны быть отсортированы в сравнении.

до:

bool exists = variants.Any(a => options.Any(b => b.SequenceEqual(a.OrderBy(x => x))));

исправлено:

bool exists = options.All(a => variants.Any(b => b.OrderBy(x => x).SequenceEqual(a.OrderBy(x => x))));
0 голосов
/ 01 марта 2019

Я бы посоветовал вам использовать HashSet<T> вместо List<T> для опций / вариантов, поскольку вы задали здесь семантику, а не семантику списка: опции могут появляться только один раз, а порядок не важен.

Например:

 var variants = new List<HashSet<string>>();
 variants.Add(new HashSet<string> {"cars", "boats", "planes"});
 variants.Add(new HashSet<string> {"money", "trees", "plants"});
 variants.Add(new HashSet<string> {"green", "blue", "red" });
 variants.Add(new HashSet<string> {"kid", "adult", "senior"});
 variants.Add(new HashSet<string> {"tax", "insurance", "salary"});

И ваш чек задом наперед: вы хотите проверить, все ли варианты соответствуют любому из вариантов.Так что вам нужно начать с вариантов.HashSet<T> имеет метод, чтобы проверить, равны ли наборы, так что вы можете использовать это:

bool exists = options.All(option => variants.Any(option.SetEquals));
0 голосов
/ 01 марта 2019

Вы можете построить HashSet для каждого списка вариантов, а затем проверить для каждого списка вариантов, по крайней мере, один набор вариантов содержит все параметры:

List<HashSet<string>> variantSets = variants.Select(vl => new HashSet<string>(vl)).ToList();

bool allIncluded = options.All(ol => variantSets.Any(vs => ol.All(vs.Contains)));

Ссылка на скрипку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...