簡體   English   中英

檢查列表是否包含包含字符串的元素並獲取該元素

[英]Check if list contains element that contains a string and get that element

在尋找這個問題的答案時,我遇到了類似的使用 LINQ 的問題,但我無法完全理解它們(並因此實現它們),因為我不熟悉它。 基本上,我想要的是:

  1. 檢查列表的任何元素是否包含特定字符串。
  2. 如果是,請獲取該元素。

老實說,我不知道我會怎么做。 我能想到的是這個(當然不工作):

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

您應該可以在這里使用 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 是一個參數,其作用類似於上述代碼中的“item”。

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方法區分大小寫。

這里有很多很好的答案,但我使用了一個簡單的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);
}

您可以使用 Linq 的FirstOrDefault擴展方法:

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

為了保持簡單,請使用它;

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

您可以使用

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

LINQ 為您提供了“查詢”任何數據集合的功能。 您可以在集合(這里是字符串的集合(列表))上使用類似數據庫查詢(選擇、位置等)的語法。

所以你正在做“從滿足給定條件的列表中獲取項目”

在您使用“lambda 表達式”的地方

簡單地說 lambda 表達式類似於(輸入參數 => 返回值)

所以對於參數“item”,它返回“item.Contains(“required string”)”。 因此,如果該項目包含字符串並因此從列表中選擇它,則它返回 true,因為它滿足條件。

我還沒有在其他答案中看到 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

您可以通過多種方式檢查列表是否為空。

1)檢查列表為空,然后檢查計數大於零,如下所示:-

if(myList!=null && myList.Count>0)
{
    //List has more than one record.
}

2) 使用如下 linq 查詢檢查列表 null 和計數大於零:-

if(myList!=null && myList.Count>0)
{
    //List has more than one record.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM