我的 Enumerable 类不适用于 Linq 语句,例如 c# 中的 .where
本文关键字:例如 中的 where 语句 Linq Enumerable 不适用 适用于 我的 | 更新日期: 2023-09-27 17:57:05
我希望能够将Linq的'.where'语句与实现接口IEnumerable的类'Books'('Book'的列表)一起使用。
//THE PROBLEM IS HERE.
IEnumerable list3 = bookList.Where(n => n.author.Length >= 14);
我收到以下错误:
错误 1 'Assignment2CuttingPhilip.Books' 不包含 'Where' 的定义,并且找不到接受类型为 'Assignment2CuttingPhilip.Books' 的第一个参数的扩展方法 'Where' (您是否缺少 using 指令或程序集引用?C:''用户''亚历克斯''保管箱''cos570 CSharp''分配2切割菲利普''分配2切割菲利普''分配2菲利普切割.cs 132 33 作业2切割菲利普
我的代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assignment2CuttingPhilip
{
public class Book
{
public string title;
public string author;
public Book(string title, string author) {
this.title = title;
this.author = author;
}
public override string ToString()
{ return "Title:''" + title + "'', Author:" + author; }
}
public class Books : IEnumerable
{
private Book[] _books;
public Books(Book[] bArray){
_books = new Book[bArray.Length];
for (int i = 0; i < bArray.Length; i++)
{_books[i] = bArray[i];}
}
IEnumerator IEnumerable.GetEnumerator()
{return (IEnumerator) GetEnumerator();}
public BooksEnum GetEnumerator()
{return new BooksEnum(_books);}
}
public class BooksEnum : IEnumerator{
public Book[] _books;
int position = -1;
public BooksEnum(Book[] list){
_books = list;}
public bool MoveNext()
{
position++;
return (position < _books.Length);
}
public void Reset()
{position = -1;}
object IEnumerator.Current
{ get { return Current; }}
public Book Current
{{ try
{ return _books[position];}
catch (IndexOutOfRangeException)
{throw new InvalidOperationException();}
}}
}
class Assignement2PhilipCutting
{
static void Main(string[] args)
{
Book[] bookArray = new Book[3]
{
new Book("Advance C# super stars", "Prof Suad Alagic"),
new Book("Finding the right lint", "Philip Cutting"),
new Book("Cat in the hat", "Dr Sues")
};
Books bookList = new Books(bookArray);
IEnumerable List = from Book abook in bookList
where abook.author.Length <= 14
select abook;
IEnumerable list2 = bookArray.Where(n => n.author.Length >= 14);
//**THE PROBLEM IS HERE**.
IEnumerable list3 = bookList.Where(n => n.author.Length >= 14);
foreach (Book abook in List)
{ Console.WriteLine(abook); }
}
}
}
这样做应该非常简单,但是为什么我不能在 C# 中将我的枚举书籍列表与 Linq 一起使用呢?我不应该能够创建一个可以使用 Fluent Linq 命令查询的可枚举列表吗?
谢谢菲尔
你的Books
类必须实现IEnumerable<Book>
,而不仅仅是IEnumerable
。与大多数 LINQ 扩展一样,Where
扩展是为实现 IEnumerable<T>
的对象创建的。此接口位于 System.Collections.Generic
命名空间中。
现在您可以使用Cast()
扩展:
var list3 = bookList.Cast<Book>().Where(n => n.author.Length >= 14);
这是您可以对仅实现IEnumerable
的旧集合执行的操作。但是,在您的方案中,Books
类是您的,因此我真的建议您将其实现IEnumerable<Book>
。
实现IEnumerable<T>
(泛型),而不仅仅是IEnumerable
,并且您将能够使用与 LINQ 相关的扩展方法。
你应该实现IEnumerable<T>
而不仅仅是IEnumerable
,或者调用Cast<Book>
IEnumerable list3 = bookList.Cast<Book>.Where(n => n.author.Length >= 14);
我建议使用第一种方法,因为您有能力,但是当您无法更改列表的实现时,您可以使用Cast<T>
从非泛型可枚举转换为泛型可枚举。但是请注意,Cast<T>
只会强制转换而不转换,因此任何自定义强制转换运算符都会导致异常