Нужен запрос LINQ для поиска списка строк в списке входных значений

#c# #linq

Вопрос:

Предположим, мне нужно выполнить поиск в inputValues списке, который начинается со списка codes . Я сделал это с помощью foreach цикла. Но мне нужно сделать то же самое с помощью LINQ:

 Listlt;stringgt; inputValues = new Listlt;stringgt; {  "S083*01999900FN0060000.000001097.00000.0020020101",  "S013*01999900FN0060000.100001097.00000.0020020101",  "S529*01999900FN0060000.999001097.00000.0020020101",  "S530*01999900FN0060000.222001097.00000.0020020101",  "S530*45199900FMo060000.222001097.00000.0020020101",  "S541*01999900FN0060000.999001097.00000.0020020101",  "S519*01999900FN0060000.999001097.00000.0020020101",  "S099*01999900FN0060000.999001097.00000.0020020101", };  Listlt;stringgt; codes = new Listlt;stringgt; {   "S099", "S529", "S530", "I897", };  private static Listlt;stringgt; GetValidList(Listlt;stringgt; inputValues,   Listlt;stringgt; codes) {  Listlt;stringgt; result=new Listlt;stringgt;();    foreach( string item in inputValues)  {  foreach(string code in codes)  {  if (item.StartsWith(code))  result.Add(item);  }  }   return result; }  

Ответ №1:

Запрос Linq может быть таким:

 var result = inputValues  .Where(value =gt; codes.Any(code =gt; value.StartsWith(code)))  .ToList();   

Здесь мы для каждого value из inputValues проверим, есть ли code codes такой, который value начинается с этого code

Метод

 private static Listlt;stringgt; GetValidList(Listlt;stringgt; inputValues,   Listlt;stringgt; codes) =gt; inputValues  .Where(value =gt; codes.Any(code =gt; value.StartsWith(code)))  .ToList();   

Редактировать: Если мы хотим вернуть дубликаты, когда codes у нас есть дубликаты (см. Комментарий Харальда Коппулса), мы можем поместить SelectMany

 private static Listlt;stringgt; GetValidList(Listlt;stringgt; inputValues,  Listlt;stringgt; codes) =gt; codes  .SelectMany(code =gt; inputValues.Where(value =gt; value.StartsWith(code)))  .ToList();  

Комментарии:

1. Большое спасибо за ваш ответ, это действительно работает. Не могли бы вы поделиться со мной какой-нибудь ссылкой, чтобы изучить некоторые методы создания такого типа LINQ?

2. @Srikant Мишра: Я научил себя, отвечая на переполнение стека и сравнивая свои ответы с лучшими. В отличие от SQL, Linq не является популярной темой для курсов, учебных лагерей…

3. Вы понимаете, что этот ответ дает другой результат, чем исходный. Например, если Listlt;stringgt; codes = new Listlt;stringgt; { "S099", "S099"}; затем исходный код даст вам входное значение "S099*01999900FN0060000.999001097.00000.0020020101" дважды, в то время как этот ответ даст его только один раз

4. @Harald Coppoolse: спасибо за интересный случай (даже если я сомневаюсь codes , что будут дубликаты)! Если мы хотим иметь дубликаты результатов, когда codes у нас есть дубликаты, которые мы можем использовать SelectMany . Я отредактировал ответ