要使用Contains方法,我将IEnumerable转换为带有ToList()
的列表,然后使用Contains()
方法,但似乎它希望我自己实现一个。我还包括了名称空间System.Collections.Generic
。基本上,我有一个这样的课程:
class BookServices(){
public int ID{ get; set; }
public string Name{ get; set; }
}
和LoadAll()方法如下:
public static IEnumerable<Books> LoadAll(){}
我只是想检查IEnumerable中是否存在某个ID,然后使用带有Name属性的元素对它做一些事情
这是我做的:
var books= BookServices.LoadAll().ToList();
var book= books.Where(stringtoCheck => stringtoCheck.Contains(id)).FirstOrDefault();
编辑:虽然我假设throw new NotImplementedException()
方法已预先实现,但Visual Studio会抛出错误Contains
Edit2:所以BookServices是Silverlight的数据模型类(如果我称之为错误,请更正我)。它将返回一个IEnumerable数组,主要用于JSON请求
答案 0 :(得分:1)
你在这里写了这个部分:
books.Where(stringtoCheck => stringtoCheck.Contains(id)).FirstOrDefault();
这意味着:
stringToCheck的类型为Book
也许你想写这样的东西:
books.Where(b => stringtoCheck.Contains(b.Id)).FirstOrDefault();
假设您的类Book有一个名为Id的类型为String的属性。
这可以通过将Where-Lambda合并到FirstOrDefault中来进一步简化:
books.FirstOrDefault(b => stringtoCheck.Contains(b.Id));
答案 1 :(得分:1)
Book
不是String
,因此您无法使用Contains
等功能。
使用类型而不是变量名来说明,您的代码如下所示:
books.Where(Book => Book.Contains(id)).FirstOrDefault();
显然,这不起作用!
如果您要搜索特定ID,则代码将如下所示:
books.Where(book => book.ID == id)).FirstOrDefault();
请注意,出于性能原因,您不应在此处使用Where
。只需将谓词传递给FirstOrDefault
:
books.FirstOrDefault(book => book.ID == id);
这很重要的原因是Where
将迭代整个集合,无论如何,而FirstOrDefault
将在找到匹配元素时停止。
实际上,FirstOrDefault
有一个优化,使两个语句等效。发生这种情况是因为FirstOrDefault
只会迭代Where
查询,直到找到匹配为止。当您不需要迭代时,不使用Where
仍然很重要。但整体而言。不过。