我的 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 命令查询的可枚举列表吗?

谢谢菲尔

我的 Enumerable 类不适用于 Linq 语句,例如 c# 中的 .where

你的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>只会强制转换而不转换,因此任何自定义强制转换运算符都会导致异常