无法对泛型列表使用.Any()

本文关键字:Any 列表 泛型 | 更新日期: 2023-09-27 18:21:30

我在控制器中有以下代码,我正在调用一个服务操作,该操作将返回List

我想用回应。Customers.Any(),因为我正在寻找特定的客户。但有时.Any()不存在。当我使用.Any().时,它会产生编译错误

不确定这是否取决于我调用操作的方式?因为我一直认为我们可以使用.Any()作为泛型列表

控制器

public class Customer
{
    public Customer(ICustomerService customerService) 
    {
        this.CustomerService = customerService;
    }
     private ICustomerService CustomerService { get; set; }
    var response = this.ExecuteServiceCall(() => this.CustomerService.getCustomerResults());
    response.customers.Any(x => x.group == "A");
}

无法对泛型列表使用.Any()

AnyIEnumerable<T>接口的扩展方法,但其实现位于System.Linq命名空间中的静态Enumerable类中。它看起来像这样:

using System;
namespace System.Linq
{
    public static class Enumerable
    {
        ...
        public static bool Any<TSource>(
            this IEnumerable<TSource> source,
            Func<TSource, bool> predicate)
        {
            foreach (var item in source)
            {
                if (predicate(item))
                {
                    return true;
                }
            }
            return false;
        }
        ...
    }
}

如果要将using System.Linq;语句用作扩展方法,则需要添加它。

或者,为了便于理解,您可以将其称为

bool b = System.Linq.Enumerable.Any(response.customers, x => x.group == "A");

确保您的类中包含System.Linq,以便能够使用.Any()

using System.Linq;

您必须首先包含名称空间System.Linq

然后,如果您的response.customers

  • 实现IEnumerable<T>,你应该很好去。

  • 显式实现IEnumerable<T>,您需要将其转换为所需的接口:

    bool hit = ((IEnumerable<Customer>)(response.customers))
               .Any( x => x.group == "A" )
               ;
    
  • 不实现IEnumerable<T>,但实现了非通用IEnumerable,您需要以不同的方式进行转换:

    bool hit = response.customers
               .Cast<Customer>()
               .Any( x => x.group == "A" )
               ;
    

客户列表是返回对象的属性,还是对象本身?像这样的东西行吗?

var customers = this.ExecuteServiceCall(() => this.CustomerService.getCustomerResults());
if (customers.Any(c => c.group == "A")
{
    . . .
}