В поисках ответа на этот вопрос я столкнулся с похожими, использующими LINQ, но я не смог полностью их понять (и, следовательно, реализовать их), поскольку я не знаком с этим. В основном я хотел бы вот что:
- Проверьте, содержит ли какой-либо элемент списка определенную строку.
- Если да, возьмите этот элемент.
Честно говоря, не знаю, как бы я это сделал. Что я могу придумать, так это (не работает, конечно):
if (myList.Contains(myString))
string element = myList.ElementAt(myList.IndexOf(myString));
Я знаю, ПОЧЕМУ не работает:
myList.Contains()
не возвращаетсяtrue
, поскольку он проверяет, соответствует ли весь элемент списка указанной мной строке.myList.IndexOf()
не найдет вхождения, поскольку, как и в этом случае, он будет проверять элемент, соответствующий строке.
Тем не менее, я понятия не имею, как решить эту проблему, но полагаю, что мне придется использовать LINQ, как предлагалось в вопросах, аналогичных моему. При этом, если это так, я бы хотел, чтобы отвечающий объяснил мне использование LINQ в своем примере (как я уже сказал, я не беспокоился об этом в свое время с C #). Заранее спасибо, ребята (а девчонки?).
РЕДАКТИРОВАТЬ: я нашел решение; просто прокрутите список, проверьте, содержит ли текущий элемент строку, а затем установите строку, равную текущему элементу. Однако мне интересно, есть ли более эффективный способ, чем этот?
string myString = "bla";
string element = "";
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Contains(myString))
element = myList[i];
}
myString
, в текущем цикле вы получите последний элемент. От вас зависит, хотите ли вы найти первый или последний, если вы просто хотите найти первый, а затем прервите цикл после нахождения элемента.Ответы:
Здесь вы сможете использовать Linq:
var matchingvalues = myList .Where(stringToCheck => stringToCheck.Contains(myString));
Если вы просто хотите вернуть первый соответствующий элемент:
var match = myList .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString)); if(match != null) //Do stuff
источник
Where
наFirstOrDefault
во втором случаеmyList.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString))
matching
определяется компилятором (var
)? Поскольку я знаю, что мой список относится к типуString
, будет ли его безопасно использоватьstring matching
в этом случае?Основной ответ: вам нужно пройти цикл и проверить, что любой элемент содержит указанную строку. Итак, допустим, код:
foreach(string item in myList) { if(item.Contains(myString)) return item; }
Эквивалентный, но краткий код:
Здесь x - параметр, который действует как «элемент» в приведенном выше коде.
источник
string result = myList.FirstOrDefault(x => x == myString) if(result != null) { //found }
источник
for (int i = 0; i < myList.Length; i++) { if (myList[i].Contains(myString)) // (you use the word "contains". either equals or indexof might be appropriate) { return i; } }
Петли Old Fashion почти всегда самые быстрые.
источник
Если вам нужен список строк, содержащих вашу строку:
var newList = myList.Where(x => x.Contains(myString)).ToList();
Другой вариант - использовать Linq FirstOrDefault
var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();
Имейте в виду, что этот
Contains
метод чувствителен к регистру.источник
Здесь много хороших ответов, но я использую простой, используя Exists , как показано ниже:
foreach (var setting in FullList) { if(cleanList.Exists(x => x.ProcedureName == setting.ProcedureName)) setting.IsActive = true; // do you business logic here else setting.IsActive = false; updateList.Add(setting); }
источник
Вы можете использовать
FirstOrDefault
метод расширения Linq :string element = myList.FirstOrDefault(s => s.Contains(myString));
Это вернет первый элемент, содержащий подстроку
myString
, илиnull
если такой элемент не найден.Если вам нужен только индекс, используйте метод
List<T>
классаFindIndex
:int index = myList.FindIndex(s => s.Contains(myString));
Это вернет индекс первого элемента, который содержит подстроку
myString
, или-1
если такой элемент не найден.источник
Вы должны иметь возможность использовать что-то вроде этого, у меня это сработало:
var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));
или что-то вроде этого, если нужно посмотреть, где не совпадает.
var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));
источник
ты можешь использовать
var match=myList.Where(item=>item.Contains("Required String")); foreach(var i in match) { //do something with the matched items }
LINQ предоставляет вам возможность «запрашивать» любую коллекцию данных. Вы можете использовать синтаксис, как запрос к базе данных (выберите, где и т. Д.) В коллекции (здесь коллекция (список) строк).
так что вы делаете что-то вроде "достань мне предметы из списка, где он удовлетворяет заданному условию"
внутри Где вы используете "лямбда-выражение"
кратко сказать, что лямбда-выражение выглядит примерно так (входной параметр => возвращаемое значение)
поэтому для параметра «item» он возвращает «item.Contains (« требуемая строка »)». Таким образом, он возвращает истину, если элемент содержит строку и, таким образом, выбирается из списка, так как он удовлетворяет условию.
источник
Чтобы было проще, используйте это;
foreach(string item in myList)//Iterate through each item. { if(item.Contains("Search Term")//True if the item contains search pattern. { return item;//Return the matched item. } }
В качестве альтернативы, чтобы сделать это с помощью цикла for, используйте this;
for (int iterator = 0; iterator < myList.Count; iterator++) { if (myList[iterator].Contains("String Pattern")) { return myList[iterator]; } }
источник
Я не видел опцию bool в других ответах, поэтому надеюсь, что приведенный ниже код кому-то поможет.
Просто используйте
Any()
string myString = "test"; bool exists = myList .Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();
источник
Можно комбинировать Any, Where, First и FirstOrDefault; или просто поместите предикат в любой из этих методов в зависимости от того, что необходимо.
Вероятно, вам следует избегать использования First, если вы не хотите, чтобы при отсутствии совпадения генерировалось исключение. FirstOrDefault обычно является лучшим вариантом, если вы знаете, что он вернет значение по умолчанию для типа, если совпадение не найдено (строка по умолчанию - null, int - 0, bool - false и т. Д.).
using System.Collections.Generic; using System.Linq; bool exists; string firstMatch; IEnumerable<string> matchingList; var myList = new List<string>() { "foo", "bar", "foobar" }; exists = myList.Any(x => x.Contains("o")); // exists => true firstMatch = myList.FirstOrDefault(x => x.Contains("o")); firstMatch = myList.First(x => x.Contains("o")); // firstMatch => "foo" firstMatch = myList.First(x => x.Contains("dark side")); // throws exception because no element contains "dark side" firstMatch = myList.FirstOrDefault(x => x.Contains("dark side")); // firstMatch => null matchingList = myList.Where(x => x.Contains("o")); // matchingList => { "foo", "foobar" }
Протестируйте этот код @ https://rextester.com/TXDL57489
источник