我有一个GroupSummary
class
,其中包含以下属性:
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; }
}
然后我有Dictionary
<string, List<GroupsSummary>
对于这些字典项中的每一项,我想找到所有不同地址,但是这个为我定义不同地址的类的属性是
PayToStr1,PayToStr2,PayToCity,PayToState
我知道我可以说像mydictionartItem.select(t => t).Distinct().ToList()
这样的东西,但我认为这会比较这个类错误的所有属性。那我该怎么解决呢?
答案 0 :(得分:4)
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());
答案 1 :(得分:2)
在IEquatable<T>
类上实现GroupsSummary
接口。可以找到更多信息here
IEquatable
定义方法Equals
。请记住重载GetHashCode
方法
答案 2 :(得分:2)
编写自己的IEqualityComparer
,如下所示:
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;
}
}
然后您可以将其传递给Distinct
这可能比直接在类上实现IEquatable<GroupsSummary>
更安全,因为在其他情况下,您可能希望测试它们是否完全相等。
答案 3 :(得分:2)
最简单的方法是实施IEqualityComparer<GroupsSummary>
然后你可以说像
HashSet<GroupSummary> unique = new HashSet<GroupsSummary>(
myDict.Values ,
new MyGroupsSummaryEqualityComparer()
) ;