c # linq, если элемент находится в списке и получает соответствующие элементы из списка - PullRequest
1 голос
/ 27 мая 2019

Если мой список содержит: английскую кошку, французскую кошку, японскую собаку, испанскую собаку

и у меня есть предмет: собака

Я не только хочу видеть, содержит ли список мой предмет, но и возвращать совпадающие предметы, поэтому я ожидаю: японская собака, испанская собака

Я дошел до того, что увидел, есть ли элемент в списке, используя следующий код:

if (myList.Any(myItem.ToLower().Contains)) { }

Ответы [ 3 ]

4 голосов
/ 27 мая 2019
var myList = new List<string>() { " japanese dog", "spanish dog", "english cat", "french cat" };
var dog = "Dog";

if (myList.Any(t=>t.Contains(dog.ToLower()))) {
    var result = myList.Where(t => t.Contains(dog.ToLower())).ToList();
}
4 голосов
/ 27 мая 2019

Я думаю, что вы ищете что-то подобное, используя предложение where:

string filter = "dog";
IEnumerable<string> filteredItems = myList.Where(m => m.ToLower().Contains(filter.ToLower()));
1 голос
/ 27 мая 2019

Мне нравится использовать регулярные выражения и делать это, например, для собак:

var animals = new List<string>() 
               { "japanese dog", "spanish dog", "english cat", "french cat" };

var dogs = animals.Where(type => Regex.IsMatch(type, "dog", RegexOptions.IgnoreCase))
                  .ToList();

// Returns {"japanese dog",  "spanish dog" } 

Почему вы можете спросить Regex, потому что он гибкий и мощный ... позвольте мне показать:

Позвольте нам продвинуться вперед в linq, отсортировав их с использованием расширения ToLookup и регулярных выражений, таких как

var sortedbyDogs 
            = animals.ToLookup(type => Regex.IsMatch(type, "dog", RegexOptions.IgnoreCase));

, который сгруппирован в памяти следующим образом:

To lookup grouping result

Тогда просто извлеките кошек, таких как

var cats = sortedbyDogs[false].ToList()

List string of cats

затем введите true для собак.


Но зачем разделять его на логическое, что если есть еще животные? Давайте добавим лемура в список, например … "french cat", "Columbian Lemur" };, мы делаем это:

var sorted = animals.ToLookup(type => Regex.Match(type, 
                                                  "(dog|cat|lemur)", 
                                                  RegexOptions.IgnoreCase).Value);

enter image description here

Тогда, чтобы получить наших кошек, вот код:

sorted["cat"].ToList()

...