Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# IEnumerable.GroupBy()中使用的类型有哪些要求?_C#_Linq - Fatal编程技术网

C# IEnumerable.GroupBy()中使用的类型有哪些要求?

C# IEnumerable.GroupBy()中使用的类型有哪些要求?,c#,linq,C#,Linq,我使用的是匿名类型的GroupBy: var v = list.GroupBy(x => new {x.street, x.houseNumber}); var o = v.Single(x => x.Key.street == "My Street" && x.Key.houseNumber == 42); 效果很好。我决定将其转化为具体类型: class StreetAddress { public StreetAddress(string _street,i

我使用的是匿名类型的
GroupBy

var v = list.GroupBy(x => new {x.street, x.houseNumber});
var o = v.Single(x => x.Key.street == "My Street" && x.Key.houseNumber == 42);
效果很好。我决定将其转化为具体类型:

class StreetAddress
{
 public StreetAddress(string _street,int _houseNumber){...}
 public string street{get; set;}
 public int houseNumber{get;set;}
}
var v = list.GroupBy(x => new StreetAddress(x.street, x.houseNumber));
var o = v.Single(x => x.Key == new StreetAddress("My Street", 42));
现在“v”完全没有分组-加载具有相同
值的项,并且
o
与任何对象都不匹配

我需要向
StreetAddress
添加什么才能使其与匿名类型一样工作

我需要向StreetAddress添加什么才能使其与匿名类型一样工作

重写
基本上等于
GetHashCode
。理想情况下,实现IEquatable,但主要是为了清晰


您的查询当前按该类型表示的唯一一种相等类型分组—引用相等。但是,当您为每个项目创建一个新实例时,没有两个键会彼此相等。

下面介绍如何实现IComparable

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

namespace ConsoleApplication93
{
    class Program
    {
        static void Main(string[] args)
        {
            var v = StreetAddress.addresses.GroupBy(x => x);
        }
    }
    class StreetAddress : IComparable
    {
        public static List<StreetAddress> addresses { get; set; }
        public string street { get; set; }
        public int houseNumber { get; set; }

        public StreetAddress() { ; }
        public StreetAddress(string _street, int _houseNumber)
        {
            StreetAddress newAddress = new StreetAddress();
            addresses.Add(newAddress);
            newAddress.street = _street;
            newAddress.houseNumber = _houseNumber;
        }
        public int CompareTo(object _other)
        {
            int results = 0;
            StreetAddress other = (StreetAddress)_other;
            if (this.street != other.street)
            {
                results = this.street.CompareTo(other.street);
            }
            else
            {
                results = this.houseNumber.CompareTo(other.houseNumber);
            }

            return results;
        }

    }


}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序93
{
班级计划
{
静态void Main(字符串[]参数)
{
var v=StreetAddress.addresses.GroupBy(x=>x);
}
}
类StreetAddress:IComparable
{
公共静态列表地址{get;set;}
公共字符串street{get;set;}
public int houseNumber{get;set;}
公共街道地址(){;}
公共街道地址(string_street,int_houseNumber)
{
StreetAddress newAddress=新StreetAddress();
地址。添加(新地址);
newAddress.street=_street;
newAddress.houseNumber=\u houseNumber;
}
公共整数比较(对象_其他)
{
int结果=0;
街道地址其他=(街道地址)\其他;
如果(本街!=其他街)
{
结果=这条街道与(其他街道)相比;
}
其他的
{
结果=此.houseNumber.CompareTo(其他.houseNumber);
}
返回结果;
}
}
}

向我们展示列表是如何定义的。这可能与您使用引用类型检查是否相等有关。尝试将StreetAddress设置为结构。
list
是对具有上述两个属性的对象集合的另一个LINQ调用的结果,这两个属性都非常正常。关于使用结构的有趣想法,那么您会自动获得成员比较吗?对于这种简单的情况,这可能更简单。要生成一个简单的linq语句,可以让类StreetAddress继承IComparable并包含CompareTo()方法。(顺便说一句,您应该开始遵循.NET命名约定-PascalCase属性名,参数名上没有下划线前缀。)我看到了关于实现
IComparable
的其他讨论。我想大胆地假设你的答案是正确的,但你能谈谈吗?是不是错了,不是很好,等等?@Mr.Boy:是的,错了。分组是关于寻找相等的值,而不是排序值。当返回零时CompareTo()不是产生相等吗?@jdweng:通常-但是
GroupBy
只是不使用
CompareTo
,因为它只对相等感兴趣。
IComparable
用于排序,而不是分组-分组使用相等比较。