#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
. Я отредактировал ответ