当前位置:  开发笔记 > 编程语言 > 正文

通用LINQ函数 - 选择Func作为参数的SelectMany

如何解决《通用LINQ函数-选择Func作为参数的SelectMany》经验,为你挑选了1个好方法。

我有一个包含许多字符串数组的类.我想要一个通用函数,它可以让我List对给定的属性有一个独特的功能.例:

public class Zoo 
{    
  string Name { get; set;}
  string[] Animals { get; set;}
  string[] Zookeepers { get; set;}
  string[] Vendors { get; set;}
}

我想要一个通用的功能,让我有一个独特List的列表中的动物?我希望这是通用的,所以我也可以得到一个明确的Zookeepers和供应商列表.

我一直在尝试这个,但它没有编译:

public static List GetExtendedList(Func filter)
{
        var Zoos = QueryZoos(HttpContext.Current);
        return Zoos.Where(z => z.Type == "Active")
            .SelectMany(filter)
            .Distinct()
            .OrderBy(s => s);
    }

注意:这与我之前提出的两个问题有关,但我在合并信息时遇到了问题.我之前曾询问如何使用SelectMany进行查询(SO 1229897)并单独询问如何编写一个使用Select而不是SelectMany获取列表的泛型函数(SO 1278989).



1> Amy B..:

"每个动物园"

点击

假设你有一个动物园列表:

List zooList = GetZooList();

然后,如果您想要来自所有动物园的不同动物,您将以这种方式应用SelectMany:

List animalList = zooList
  .SelectMany(zoo => zoo.animals)
  .Distinct()
  .ToList();

如果您经常执行此任务并希望一个函数包装这三个调用,您可以这样编写这样的函数:

public static List GetDistinctStringList(
  this IEnumerable source,
  Func> childCollectionFunc
)
{
  return source.SelectMany(childCollectionFunc).Distinct().ToList();
}

然后会被称为:

List animals = ZooList.GetDistinctStringList(zoo => zoo.animals);

对于不编译的代码示例(您没有给出错误消息),我推断您需要添加ToList():

.OrderBy(s => s).ToList();

另一个问题(为什么不能推断出类型参数)是string[]没有实现的IEnumerable.将该类型参数更改为IEnumerable而不是string[]

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有