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()
) ;