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();