首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么SelectMany需要M<S> -> (S -> M<C>) -> (S -> M<C> -> R) -> E<R>之一?

为什么SelectMany需要M<S> -> (S -> M<C>) -> (S -> M<C> -> R) -> E<R>之一?
EN

Stack Overflow用户
提问于 2017-06-05 12:01:24
回答 0查看 58关注 0票数 0

在链接https://msdn.microsoft.com/en-us/library/bb534631(v=vs.110).aspx中,第三个签名是

代码语言:javascript
复制
// 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文档给出了一个示例来说明该方法的用法。

代码语言:javascript
复制
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 = ...,如下所示?

代码语言:javascript
复制
var query = petOwners.SelectMany(o => o.Pets.Select(p => new { petOwner = o, petName =p}))

带第三个签名的SelectMany什么时候会真正有用呢?

EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44361497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档