C# 通用LINQ函数-以selection Func作为参数的SelectMany

C# 通用LINQ函数-以selection Func作为参数的SelectMany,c#,linq-to-objects,C#,Linq To Objects,我有一个有很多字符串数组的类。我希望有一个通用函数,它可以为给定属性获取唯一的列表。例如: public class Zoo { string Name { get; set;} string[] Animals { get; set;} string[] Zookeepers { get; set;} string[] Vendors { get; set;} } 我想有一个通用函数,它将为我提供一个独特的列表?我希望这是通用的,所以我也可以得到一个明确的动物园管理

我有一个有很多字符串数组的类。我希望有一个通用函数,它可以为给定属性获取唯一的
列表。例如:

public class Zoo 
{    
  string Name { get; set;}
  string[] Animals { get; set;}
  string[] Zookeepers { get; set;}
  string[] Vendors { get; set;}
}
我想有一个通用函数,它将为我提供一个独特的
列表
?我希望这是通用的,所以我也可以得到一个明确的动物园管理员和供应商名单

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

public static List<string> GetExtendedList(Func<Zoo, string[]> filter)
{
        var Zoos = QueryZoos(HttpContext.Current);
        return Zoos.Where(z => z.Type == "Active")
            .SelectMany(filter)
            .Distinct()
            .OrderBy(s => s);
    }
公共静态列表GetExtendedList(Func过滤器)
{
var Zoos=QueryZoos(HttpContext.Current);
返回Zoos.Where(z=>z.Type==“活动”)
.SelectMany(过滤器)
.Distinct()
.OrderBy(s=>s);
}

注意:这与我以前问过的两个问题有关,但我在合并信息时遇到了问题。我以前问过,也分别问过如何编写一个通用函数。

最好的方法是为每个
字符串[]
创建一个通用函数,这样可以过滤掉所有重复的函数

由于
HashSet
有一个接受
IEnumerable
的构造函数,您只需通过将每个数组传递到构造函数中来实例化
HashSet
。产生的
HashSet
将是
字符串的不同列表。虽然这不是您要求的
列表
HashSet
确实实现了
ICollection
,因此您需要的许多方法可能都可用

static ICollection<String> GetDistinct(IEnumerable<String> sequence)
{
    return new HashSet<String>(sequence);
}
静态ICollection GetDistinct(IEnumerable序列)
{
返回新的HashSet(序列);
}

也许我没有领会你的意思,但我只是

List<String> distinctAnimals = zoo.Animals.Distinct().ToList();
List distinctAnimals=zoo.anies.Distinct().ToList();
我会照你说的做,我想你是说别的

编辑: 如果你有一个动物园的列表,但是你想要不同的动物,那么选择很多是正确的选择,因为使用linq声明性语法更容易

List<String> animals = (from z in zoos
                       from s in z.Animals
                       select s).Distinct().ToList();
列出动物=(从动物园中的z开始)
从s到z。动物
选择s.Distinct().ToList();
“每个动物园”

点击

假设你有一张动物园的清单:

List<Zoo> zooList = GetZooList();

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

我不需要筛选每个列表中的重复项,我需要集合中所有项的子项重复数据消除列表。按照我的类比,如果每个动物园都有一只狮子和一只老虎,那也没关系,但我需要一个函数,它可以让我得到所有动物园中所有动物类型的列表。嗯。。我明白你的意思。重构
Zoo
类型是一个选项吗?可能是的,但我真的很想学习LINQ解决方案,而不是每次遇到这个问题时都重复这个问题。尽管如此,还是要感谢你的意见!他要求的是一个通用的解决方案,而不是独特的()。ToList()不是通用的,看看他的其他帖子。对不起,我的问题没有明确说明。我在寻找一个通用的解决方案。我已经更新了问题陈述。啊,编辑之后我明白你的意思了。我认为Andrew的答案是正确的。我的错误消息:错误15无法从用法推断方法“System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,System.Func)”的类型参数。尝试显式指定类型参数。谢谢,这非常有效。我将接受并考虑将其转换为非扩展方法,以确保我完全理解它。我遇到的主要问题似乎是正确声明Func参数。实际上,
string[]
确实实现了
IEnumerable
。真正的问题是
Func
是一种不同于
Func
的委托类型;不同的委托类型不能直接兼容。
List<string> animalList = zooList
  .SelectMany(zoo => zoo.animals)
  .Distinct()
  .ToList();
public static List<string> GetDistinctStringList<T>(
  this IEnumerable<T> source,
  Func<T, IEnumerable<string>> childCollectionFunc
)
{
  return source.SelectMany(childCollectionFunc).Distinct().ToList();
}
List<string> animals = ZooList.GetDistinctStringList(zoo => zoo.animals);
.OrderBy(s => s).ToList();