将IEnumerable <t>转换为列表,然后使用Contains方法</t>

时间:2014-06-18 15:47:23

标签: c# linq ienumerable

要使用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请求

2 个答案:

答案 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仍然很重要。但整体而言。不过。