Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq是否会产生冗余?_C#_Vb.net_Linq_Linqpad - Fatal编程技术网

C# Linq是否会产生冗余?

C# Linq是否会产生冗余?,c#,vb.net,linq,linqpad,C#,Vb.net,Linq,Linqpad,我参考了中的例子。我们有两个列表,第一个包含person对象(first-name和Lastname)。第二个列表包含宠物对象(名称),其中包含个人对象(宠物所有者)。一个人可以拥有>=0只宠物 现在发生的事情是我参加了这个小组 Dim result1 = From pers in people Group Join pet in pets on pers Equals pet.Owner Into PetList = Gr

我参考了中的例子。我们有两个列表,第一个包含person对象(first-name和Lastname)。第二个列表包含宠物对象(名称),其中包含个人对象(宠物所有者)。一个人可以拥有>=0只宠物

现在发生的事情是我参加了这个小组

Dim result1 = From pers in people
            Group Join pet in pets
            on pers Equals pet.Owner
            Into PetList = Group
LinqPad向我显示了结果:

在我看来,Linq产生了大量冗余(但我可能错了!)。第一个结果对象将持有person对象三次。作为一名Linq nooby,我在这里遇到了两个问题(但也许我阅读输出的方式不正确):

  • 人员对象是否为引用对象?不幸的是,我找不到关于它的任何东西
  • 按照上面提到的示例,查询将继续

  • 如果我们在PetList中有关于Person对象的所有信息,为什么不直接查询这个对象呢?在我看来,我们不再需要这个物体了

    是的,这些Person对象是引用。LINQ没有克隆Person对象


    产生这种输出的原因是LINQPad试图向您展示那个人是谁。如果不重复它的属性和字段,就很难知道它指的是什么人。

    我认为这里的关键事实是linq使用延迟执行,这应该被编译成一种格式,这意味着这些冗余不会被创建(尽可能多),谢谢你的回答!这意味着LINQPad显示Key=Person对象,但它不在.NET中生成的acutal对象中?我刚刚检查过,宠物列表中只有一只宠物和一个主人的财产。我明白你的意图,但还是让人困惑。
    Select pers.FirstName , pers.LastName,
    PetName = If(pet is Nothing, String.Empty, pet.Name)