C# 查找字典的不同值

C# 查找字典的不同值,c#,linq,C#,Linq,我有一个GroupSummary类,其中有一些类似的属性: public class GroupsSummary { public bool FooMethod() { //// } public bool UsedRow { get; set; } public string GroupTin { get; set; } public string PayToZip_4 { get; set; } public stri

我有一个
GroupSummary
,其中有一些类似的属性:

public class GroupsSummary
{
    public bool FooMethod()
    {
      ////
    }
    public bool UsedRow { get; set; }

    public string GroupTin   { get; set; }
    public string PayToZip_4 { get; set; }
    public string PayToName  { get; set; }

    public string PayToStr1     { get; set; }
    public string PayToStr2     { get; set; }
    public string PayToCity     { get; set; }
    public string PayToState    { get; set; }
    public bool   UrgentCare_YN { get; set; }
}

然后我有一个
字典
t).Distinct().ToList()
,但我认为这将比较这个类的所有属性,这是错误的。那么我应该如何解决这个问题呢?

GroupsSummary
类上实现
IEquatable
接口。可以找到更多信息

充足的
定义方法
等于
。记住还要重载
GetHashCode
方法

编写自己的
IEqualityComparer
,如下所示:

var newDict = dict.ToDictionary(
                    x=>x.Key, 
                    v=>v.Value.GroupBy(x=>new{x.PayToStr1, x.PayToStr2, x.PayToCity, x.PayToState})
                              .Select(x=>x.First())
                              .ToList());
    public class GroupsSummaryComparer : IEqualityComparer<GroupsSummary>
    {
        public bool Equals(GroupsSummary x, GroupsSummary y)
        {
            if (object.ReferenceEquals(x, y))
                return true;
            else if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null))
                return false;

            return x.PayToStr1 == y.PayToStr1 && x.PayToStr2 == y.PayToStr2 && x.PayToCity == y.PayToCity && x.PayToState == y.PayToState;
        }

        public int GetHashCode(GroupsSummary obj)
        {
            if (obj == null)
                return 0;
            int code;
            if (obj.PayToStr1 != null)
                code ^= obj.PayToStr1.GetHashCode();
            if (obj.PayToStr2 != null)
                code ^= obj.PayToStr2.GetHashCode();
            if (obj.PayToCity != null)
                code ^= obj.PayToCity.GetHashCode();
            if (obj.PayToState != null)
                code ^= obj.PayToState.GetHashCode();
            return code;
        }
    }
公共类组汇总比较器:IEqualityComparer
{
公共布尔等于(GroupsSummary x,GroupsSummary y y)
{
if(object.ReferenceEquals(x,y))
返回true;
else if(object.ReferenceEquals(x,null)| | object.ReferenceEquals(y,null))
返回false;
返回x.PayToStr1==y.PayToStr1&&x.PayToStr2==y.PayToStr2&&x.paytoscity==y.paytoscity&&x.PayToState==y.PayToState;
}
public int GetHashCode(GroupsSummary obj)
{
if(obj==null)
返回0;
int代码;
如果(obj.PayToStr1!=null)
代码^=obj.PayToStr1.GetHashCode();
如果(obj.PayToStr2!=null)
代码^=obj.PayToStr2.GetHashCode();
if(obj.PayToCity!=null)
代码^=obj.PayToCity.GetHashCode();
if(obj.PayToState!=null)
代码^=obj.PayToState.GetHashCode();
返回码;
}
}
然后你可以把它传给


这可能比直接在类上实现更安全,因为在其他情况下,您可能需要测试它们是否完全相等。

最简单的方法是实现

然后你可以说

HashSet<GroupSummary> unique = new HashSet<GroupsSummary>(
  myDict.Values ,
  new MyGroupsSummaryEqualityComparer()
  ) ;
HashSet unique=新HashSet(
myDict.价值观,
新MyGroupsMMaryEqualityComparer()
) ;

GroupsSummary
实施
IEquatable
,或者您可以使用采用
IEqualityComparer
Distinct
版本。请参阅:您还可以在类中创建一个只读属性
address
,该属性是您想要的那些属性的集合,并将该属性用于lambda表达式……那么“GroupBy”呢?可以这样做而不是实现IEquatable吗?它说不能从用法推断类型参数。所以当我输入x时。它找不到任何财产。也在红线下groupBy@user1899082它应该适用于字典
字典
。您确定您使用的是您发布的有问题的dict类型吗?我的dic定义如下:“Dictionary groupsDictionary=new Dictionary();”原始数据源是
Dictionary
。使用这种方法,不可能将每个唯一地址与原始
字符串
键相关联。这将简单地返回原始
字典中所有唯一地址的集合。也许不完全是OP想要的,但简洁易懂。
HashSet<GroupSummary> unique = new HashSet<GroupsSummary>(
  myDict.Values ,
  new MyGroupsSummaryEqualityComparer()
  ) ;