170

在寻找这个问题的答案时,我遇到了类似的使用 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];
}
4

13 回答 13

235

您应该可以在这里使用 Linq:

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

如果您只想返回第一个匹配项:

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

if(match != null)
    //Do stuff
于 2013-09-12T14:44:00.050 回答
31

基本答案是:您需要遍历循环并检查任何元素是否包含指定的字符串。所以,假设代码是:

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

等效但简洁的代码是:

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

这里,x 是一个参数,作用类似于上述代码中的“item”。

于 2013-09-12T14:46:20.787 回答
13
string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
  //found
}
于 2013-09-12T14:43:58.847 回答
9
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;
    }
}

旧时尚循环几乎总是最快的。

于 2013-09-12T14:44:06.083 回答
7

如果你想要一个包含你的字符串的字符串列表:

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

另一种选择是使用 Linq FirstOrDefault

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

请记住,该Contains方法区分大小写。

于 2013-09-12T14:44:44.570 回答
3

这里有很多好的答案,但我使用了一个简单的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);
}
于 2018-02-03T13:30:48.460 回答
2

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

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

这将返回包含 substring 的第一个元素myString,或者null如果没有找到这样的元素。

如果您只需要索引,请使用List<T>类的FindIndex方法:

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

这将返回包含 substring 的第一个元素的索引myString,或者-1如果没有找到这样的元素。

于 2013-09-12T14:44:35.117 回答
2

你应该可以使用这样的东西,它对我来说没问题:

var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));

或类似的东西,如果您需要查看不匹配的位置。

 var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));
于 2019-08-09T14:10:56.200 回答
1

为了简单起见,请使用它;

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];
        }
    }
于 2013-09-12T14:50:08.063 回答
1

您可以使用

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,因此它从列表中被选中,因为它满足条件。

于 2013-09-12T14:56:25.480 回答
0

我没有在其他答案中看到 bool 选项,所以我希望下面的代码对某人有所帮助。

只需使用Any()

string myString = "test";
bool exists = myList
             .Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();
于 2019-03-01T10:34:14.443 回答
0

可以组合 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

于 2020-07-13T17:41:43.987 回答
-1

您可以通过多种方式检查列表是否为空。

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.
}
于 2021-07-22T09:45:41.777 回答