查找字典的不同值

时间:2014-08-01 19:22:03

标签: c# linq

我有一个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()这样的东西,但我认为这会比较这个类错误的所有属性。那我该怎么解决呢?

4 个答案:

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