繁体   English   中英

C#Linq Group by Distinct无法正常工作

[英]C# Linq Group by with Distinct not working

我在这里回顾了许多关于如何在列表对象上使用LINQ语句进行分组的文章,但是即使所有变量的值完全相同,以下代码也无法对任何分组。 有人可以告诉我为什么这可能行不通吗? 它与LINQ延迟执行有关吗? 我尝试了一个示例,其中包含了第二个选择语句,但没有帮助。 我要传递一个list<MyClass>对象,该对象具有两个相同的项目,而另一个不相同,因此当执行该语句时,我应该只收到两个项目。

代码中的实际值:

   Type = 1, Capacity = 50, Goal = "Teach algebra", 
   Attachments = "", Hours = 1, TypeDesignation = 3, 
   TypeControl = 1, Supplies = 0 

   TypeControl and Supplies are both objects themselves. Supplies is empty.
   TypeControl contains Id = 23, Text = "Math", Active = 1

        var test = newclass.GroupBy(n => new 
        {
            n.Type,
            n.Capacity,
            n.Goal,
            n.Attachments,
            n.Hours,
            n.TypeDesignation,
            n.TypeControl,
            n.Supplies

        }).Distinct().Select(n => new MyClass()
        {
            Type = n.Key.Type,
            Capacity = n.Key.Capacity,
            Goal = n.Key.Goal ,
            Attachments = n.Key.Attachments,
            Hours = n.Key.Hours ,
            TypeDesignation = n.Key.TypeDesignation,
            TypeControl = n.Key.TypeControl,
            Supplies = n.Key.Supplies
        });

我的问题的答案是,里面的所有对象实际上是不相等的,因为我有一个子对象,在按对象分组的过程中,一个对象被读取为空,而另一个对象被读取为0,因此它们从来没有在一起,但是当我用智能感知看他们的时候,他们总是都说无效。 我通过遍历列表并使用比较器方法向下钻取子对象并找到差异来解决了该问题。

        VerifyDuplicates duplicates = new VerifyDuplicates();

        List<MyClass> newClass = new List<MyClass>(); 

        classes = classes.OrderBy(s => s.Type).ToList();
        List<int> idsToDelete = new List<int>();
        for (int i = 0; i < classes.Count; i++)
        {
            if (i + 1 < classes.Count)
            {
                var x = duplicates.Compare(classes[i], classes[i + 1]);
                if (x == 1)
                    idsToDelete.Add(classes[i+1].Id);
            }
        }
        newClass = classes.Where(n => !idsToDelete.Contains(n.Id)).Select(n => n).ToList();

    public class VerifyDuplicates : Comparer<MyClass>
    {
        public override int Compare(MyClass x, MyClass y)
        {
            int p = 0;

            if(x != null && y != null)
            { 
                if(x.Type.Equals(y.Type)) { p += 1; }
                if(x.Attachments.Equals(y.Attachments)) { p += 1; }
                if(x.Capacity.Equals(y.Capacity)) { p += 1; }
                if(x.Goal.Equals(y.Goal)) { p += 1; }
                if(x.Hours.Equals(y.Hours)) { p += 1; }
                if(x.TypeDesignation.Equals(y.TypeDesignation)) { p += 1; }
                if(x.TypeControl != null && y.TypeControl != null)
                    if(x.TypeControl[0].Equals(y.TypeControl[0])) { p += 1; }
                if(x.Supplies != null && y.Supplies!= null)
                    if (x.Supplies.Equals(y.Supplies)) { p += 1; }

                return p;
            }
      }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM