这里我有一个简单的例子,在字符串列表中查找一个项。通常我使用for循环或匿名委托来这样做:

int GetItemIndex(string search)
{
   int found = -1;
   if ( _list != null )
   {
     foreach (string item in _list) // _list is an instance of List<string>
     {
        found++;
        if ( string.Equals(search, item) )
        {
           break;
        }
      }
      /* Use an anonymous delegate
      string foundItem = _list.Find( delegate(string item) {
         found++;
         return string.Equals(search, item);
      });
      */
   }
   return found;
}

LINQ对我来说是新的。我可以使用LINQ在列表中查找项目吗?如果这是可能的,怎么做?


当前回答

有几种方法(注意,这不是一个完整的列表)。

Single将返回单个结果,但如果它发现一个或多个结果(这可能是你想要的,也可能不是),则会抛出异常: 字符串搜索= "lookforme"; myList = new List<string>(); string result = myList。单(s => s == search);

注意,SingleOrDefault()的行为与此相同,只是它将为引用类型返回null,或为值类型返回默认值,而不是抛出异常。

Where将返回所有符合条件的项,所以你可能会得到一个IEnumerable<string>的元素: IEnumerable<string> results = myList。Where(s => s == search); First将返回符合条件的第一个项: string result = myList。首先(s => s == search);

注意,FirstOrDefault()的行为与此相同,只是它将为引用类型返回null,或为值类型返回默认值,而不是抛出异常。

其他回答

你可以使用FirstOfDefault和Where LINQ扩展从IEnumerable中获取MessageAction类。芮米

var action = Message.Actions.Where(e => e.targetByName == className).FirstOrDefault<MessageAction>();

在哪里

List<MessageAction> Actions { get; set; }

这种方法更简单、更安全

var lOrders = new List<string>();

bool insertOrderNew = lOrders。Find(r => r == "1234") == null ?True: false

如果它确实是一个List<string>,你不需要LINQ,只需使用:

int GetItemIndex(string search)
{
    return _list == null ? -1 : _list.IndexOf(search);
}

如果你正在寻找物品本身,试试:

string GetItem(string search)
{
    return _list == null ? null : _list.FirstOrDefault(s => s.Equals(search));
}

这将帮助您在LINQ列表搜索中获得第一个或默认值

var results = _List.Where(item => item == search).FirstOrDefault();

此搜索将找到第一个或默认值,并返回该值。

IndexOf怎么样?

搜索指定对象并返回列表中第一个出现项的索引

例如

> var boys = new List<string>{"Harry", "Ron", "Neville"};  
> boys.IndexOf("Neville")  
2
> boys[2] == "Neville"
True

注意,如果该值没有出现在列表中,则返回-1

> boys.IndexOf("Hermione")  
-1