gpt4 book ai didi

c# - 为什么使用匿名类型有效而使用不在 GroupBy 中的显式类型?

转载 作者:太空狗 更新时间:2023-10-29 17:49:50 26 4
gpt4 key购买 nike

我有一个问题,我希望一个组类型是强类型的,但如果我这样做了,它就不能正确分组。看下面的代码...

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication35
{
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>();
foos.Add(new Foo() { Key = "Test" });
foos.Add(new Foo() { Key = "Test" });
foos.Add(new Foo() { Key = "Test" });

var groups = foos.GroupBy<Foo, dynamic>(entry => new
{
GroupKey = entry.Key
});

Console.WriteLine(groups.Count());

groups = foos.GroupBy<Foo, dynamic>(entry => new GroupingKey()
{
GroupKey = entry.Key
});

Console.WriteLine(groups.Count());

}

public class Foo
{
public string Key { get; set; }
}

public class GroupingKey
{
public string GroupKey { get; set; }
}
}
}

输出:

1
3
Press any key to continue . . .

无论是否使用显式类型,我都希望结果是相同的,即应该只是一组有 3 个项目,而不是 3 个组有 1 个项目。这是怎么回事?

更新我添加了一个 IEqualityComparer,现在可以使用了!见下文:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication35
{
class Program
{
static void Main(string[] args)
{
List<Foo> foos = new List<Foo>();
foos.Add(new Foo() { Key = "Test" });
foos.Add(new Foo() { Key = "Test" });
foos.Add(new Foo() { Key = "Test" });

var groups = foos.GroupBy<Foo, dynamic>(entry => new //GroupingKey()
{
GroupKey = entry.Key
});

Console.WriteLine(groups.Count());

groups = foos.GroupBy<Foo, GroupingKey>(entry => new GroupingKey()
{
GroupKey = entry.Key
}, new GroupingKeyEqualityComparer());

Console.WriteLine(groups.Count());

}

public class Foo
{
public string Key { get; set; }
}

public class GroupingKey
{
public string GroupKey { get; set; }
}

public class GroupingKeyEqualityComparer : IEqualityComparer<GroupingKey>
{
#region IEqualityComparer<GroupingKey> Members

public bool Equals(GroupingKey x, GroupingKey y)
{
return x.GroupKey == y.GroupKey;
}

public int GetHashCode(GroupingKey obj)
{
return obj.GroupKey.GetHashCode();
}

#endregion
}
}
}

输出:

1
1
Press any key to continue . . .

这几乎证实了 JaredPar 给出的答案!

最佳答案

在第一个版本中,您将创建一个匿名类型,它具有一个名为 GroupKey 的属性。 C# 中的匿名类型使用结构相等性,因此值的相等性归结为键的相等性。这使它们可以正确地组合在一起。

在第二种情况下,您使用的是名为 GroupingKey 的自定义类型。看起来这使用了默认或引用相等性。因此,没有一个实例被认为是相等的,因此它们被分到不同的组中。

关于c# - 为什么使用匿名类型有效而使用不在 GroupBy 中的显式类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016280/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com