在链接https://msdn.microsoft.com/en-us/library/bb534631(v=vs.110).aspx中,第三个签名是
// M<S> -> (S -> M<C>) -> (S -> M<C> -> R) -> E<R>
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TCollection>> collectionSelector,
Func<TSource, TCollection, TResult> resultSelector
)第一个具有典型Monad绑定函数M<A> -> (A -> M<B>) -> M<B>签名的函数还不够吗?将resultSelector中的代码合并到collectionSelector中不是很容易吗
MSDN文档给出了一个示例来说明该方法的用法。
class Program
{
static void Main(string[] args)
{
SelectManyEx3();
}
public static void SelectManyEx3()
{
PetOwner[] petOwners =
{ new PetOwner { Name="Higa",
Pets = new List<string>{ "Scruffy", "Sam" } },
new PetOwner { Name="Ashkenazi",
Pets = new List<string>{ "Walker", "Sugar" } },
new PetOwner { Name="Price",
Pets = new List<string>{ "Scratches", "Diesel" } },
new PetOwner { Name="Hines",
Pets = new List<string>{ "Dusty" } } };
// Project the pet owner's name and the pet's name.
var query =
petOwners
.SelectMany(petOwner => petOwner.Pets, (petOwner, petName) => new { petOwner, petName })
.Where(ownerAndPet => ownerAndPet.petName.StartsWith("S"))
.Select(ownerAndPet =>
new
{
Owner = ownerAndPet.petOwner.Name,
Pet = ownerAndPet.petName
}
);
// Print the results.
foreach (var obj in query1)
{
Console.WriteLine(obj);
}
}
}
class PetOwner
{
public string Name { get; set; }
public List<string> Pets { get; set; }
}但是,可以使用第一个签名的SelectMany重写var query = ...,如下所示?
var query = petOwners.SelectMany(o => o.Pets.Select(p => new { petOwner = o, petName =p}))带第三个签名的SelectMany什么时候会真正有用呢?
https://stackoverflow.com/questions/44361497
复制相似问题