根据ID从列表中查找项目

use*_*746 2 c# linq lambda

我有这门课

public class item
{
        public int itemID { get; set; }
        public int itemValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个变量

public List<item> itemList;
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用lambda在itemList中搜索并找到itemID = i的项目.通常,没有lamda的函数如下:

public item FindItem(int i)
{
foreach (var t in itemList)
{
  if (t.itemID==i)
    return t;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)

我试着用这个lambda替换它

item Item = itemList.Where(x=>x.itemID==i).Select(x=>x);
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说:

Error   1 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<item>' to 'item'. An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)

我该怎么纠正这个?我还在学习lambda,Linq

Ily*_*nov 6

null如果您没有找到任何项目,则返回,请使用下一个代码作为等效代码:

public item FindItem(int i)
{
    return itemList.FirstOrDefault(item => item.itemId == i);
}
Run Code Online (Sandbox Code Playgroud)

FirstOrDefault被描述为Returns the first element of a sequence, or a default value if the sequence contains no elements.(msdn).

itemtype是一个类,因此默认值是null.

你正在使用Selectafter Where子句,它基本上是一个过滤后的投影.它需要一个类型的序列A并返回一个类型的序列B.您需要折叠序列,换句话说,找到一个符合某些条件的项目.有在LINQ(相当多的折叠查询First,Single,Max,Last,Aggregate,等),它们都返回类型的一个项目A,从类型的序列A.FirstOrDefault似乎很适合您当前的C#实现.