none
关于Selectmany的疑问 RRS feed

  • 问题

  • Msdn文档的链接

    https://msdn.microsoft.com/zh-cn/library/bb534631(v=vs.110).aspx

    class PetOwner
    {
        public string Name { get; set; }
        public List<string> Pets { get; set; }
    }
    
    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 query)
        {
            Console.WriteLine(obj);
        }
    }

    他是怎么推导出(petOwner, petName)里面的petOwner是PetOwner类型,petname是string类型,为什么我再加一个参数,比如(petOwner, petName,Pets)为什么它就推到不出来那,Pets应该是List<string>类型啊,

    还有就是petOwner => petOwner.Pets,在这里有什么作用啊?


    please verify my account


    • 已编辑 lctk 2016年5月13日 3:21
    2016年5月13日 3:18

答案

  • Hello Lctk,

    >> 他是怎么推导出(petOwner, petName)里面的petOwner是PetOwner类型,petname是string类型,为什么我再加一个参数,比如(petOwner, petName,Pets)为什么它就推到不出来那,Pets应该是List<string>类型啊,

    第二个参数定义好了是这个方法Func<TSource, TCollection, TResult> resultSelector,第一个参数TSource,第二个参数TCollection,返回值TResult,没办法再传一个Pets集合了。

    >> 还有就是petOwner => petOwner.Pets,在这里有什么作用啊?

    作用就是指示这个数据源用于后面第二个参数上的方法。

    这个场景中的方法的作用是把 “宠物主人对应宠物集合” 的一个数组转化成 “宠物主人对应一个宠物”的数组,然后根据 Where提供的方法筛选出宠物名字是S开头的元素。

    希望能够帮到你。



    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 lctk 2016年5月14日 3:00
    2016年5月14日 1:21

全部回复

  • petOwner => petOwner.Pets

    这是拉姆达表达式,相当于一个匿名方法,方法执行完成后返回Pets对象


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月13日 6:05
  • Hello Lctk,

    >> 他是怎么推导出(petOwner, petName)里面的petOwner是PetOwner类型,petname是string类型,为什么我再加一个参数,比如(petOwner, petName,Pets)为什么它就推到不出来那,Pets应该是List<string>类型啊,

    第二个参数定义好了是这个方法Func<TSource, TCollection, TResult> resultSelector,第一个参数TSource,第二个参数TCollection,返回值TResult,没办法再传一个Pets集合了。

    >> 还有就是petOwner => petOwner.Pets,在这里有什么作用啊?

    作用就是指示这个数据源用于后面第二个参数上的方法。

    这个场景中的方法的作用是把 “宠物主人对应宠物集合” 的一个数组转化成 “宠物主人对应一个宠物”的数组,然后根据 Where提供的方法筛选出宠物名字是S开头的元素。

    希望能够帮到你。



    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 lctk 2016年5月14日 3:00
    2016年5月14日 1:21
  • 解释的很详细

    please verify my account

    2016年5月14日 3:00