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

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

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

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

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

Я знаю, почему это не работает:

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

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

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

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

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

9 ответов


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

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

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

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

if(match != null)
    //Do stuff

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

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

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

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

здесь 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;
    }
}

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


Если вы хотите получить список строк, содержащих строку:

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

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

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

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


вы могли бы использовать LINQ это FirstOrDefault метод расширения:

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

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

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

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

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


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

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

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

таким образом, Вы делаете, как "получить мне элементы из списка, где он удовлетворяет заданному условию"

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

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

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


чтобы сохранить его простым, используйте это;

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

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

много хороших ответов здесь, но я использую простой с помощью , как показано ниже:

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