Проверить, содержит ли список элемент, содержащий строку, и получить этот элемент

При поиске ответа на этот вопрос я столкнулся с подобными, использующими LINQ, но я не смог их полностью понять (и, следовательно, реализовать), поскольку я не знаком с ним. В основном я хотел бы:

  • Проверьте, содержит ли какой-либо элемент списка определенную строку.
  • Если это так, получите этот элемент.

Честно говоря, я не знаю, как это сделать. Я могу придумать это (не работает, конечно):

if (myList.Contains(myString))
    string element = myList.ElementAt(myList.IndexOf(myString));

Я знаю, ПОЧЕМУ это не работает:

  • myList.Contains() не возвращает true, так как будет проверять, соответствует ли весь элемент списка указанной строке.
  • myList.IndexOf() не найдет вхождения, так как, как и в случае с этим, он проверит элемент, соответствующий строке.

Тем не менее, я не знаю, как решить эту проблему, но я полагаю, что мне придется использовать LINQ, как было предложено в подобных вопросах, для моего. При этом, если это так, я хотел бы, чтобы ответчик объяснил мне использование LINQ в их примере (как я уже сказал, я не беспокоился об этом в свое время с С#). Спасибо заранее, парни (и девушки?).

EDIT: я придумал решение; просто пройдите по списку, проверьте, содержит ли текущий элемент строку, а затем установите строку, равную текущему элементу. Мне интересно, однако, есть ли более эффективный способ, чем это?

string myString = "bla";
string element = "";

for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Contains(myString))
        element = myList[i];
}

Ответ 1

Вы можете использовать Linq здесь:

var matchingvalues = myList
    .Where(stringToCheck => stringToCheck.Contains(myString));

Если вы просто хотите вернуть первый соответствующий элемент:

var match = myList
    .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));

if(match != null)
    //Do stuff

Ответ 2

Основной ответ: Вам нужно пройти через цикл и проверить, содержит ли какой-либо элемент указанную строку. Итак, Давайте скажем, что код

foreach(string item in myList)
{
  if(item.Contains(myString))
       return item;
}

Эквивалентный, но краткий код

mylist.Where(x => x.Contains(myString)).FirstOrDefault();

Здесь x - параметр, который действует как элемент в приведенном выше коде.

Ответ 3

string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
  //found
}

Ответ 4

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;
    }
}

Старые модники почти всегда самые быстрые.

Ответ 5

Если вам нужен список строк, содержащих вашу строку:

var newList = myList.Where(x => x.Contains(myString)).ToList();

Другой вариант - использовать Linq FirstOrDefault

var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();

Имейте в виду, что метод Contains чувствителен к регистру.

Ответ 6

Вы можете использовать Linq FirstOrDefault метод расширения:

string element = myList.FirstOrDefault(s => s.Contains(myString));

Это вернет элемент кулака, содержащий подстроку myString или null, если такой элемент не найден.

Если вам нужен только индекс, используйте метод List<T> class FindIndex:

int index = myList.FindIndex(s => s.Contains(myString));

Это вернет индекс элемента fist, который содержит подстроку myString или -1, если такой элемент не найден.

Ответ 7

Чтобы упростить это использование,

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, используйте это:

    for (int iterator = 0; iterator < myList.Count; iterator++)
    {
        if (myList[iterator].Contains("String Pattern"))
        {
            return myList[iterator];
        }
    }

Ответ 8

вы можете использовать

var match=myList.Where(item=>item.Contains("Required String"));
foreach(var i in match)
{
//do something with the matched items
}

LINQ предоставляет вам возможности "запрашивать" любую коллекцию данных. Вы можете использовать синтаксис как запрос базы данных (select, where и т.д.) В коллекции (здесь коллекция (список) строк).

так что вы делаете так: "Получите меня из списка, где он удовлетворяет заданному условию"

внутри Где вы используете "лямбда-выражение"

чтобы кратко рассказать лямбда-выражение, это что-то вроде (input parameter = > return value)

поэтому для параметра "item" он возвращает "item.Contains(" обязательная строка ")". Таким образом, он возвращает true, если элемент содержит строку и, следовательно, он выбирается из списка, поскольку он удовлетворяет условию.