【问题标题】:Skip duplicated records that have same value for same property [duplicate]跳过对相同属性具有相同值的重复记录[重复]
【发布时间】:2019-12-19 20:41:16
【问题描述】:

我正在尝试创建一个名为“FreelancerProjectsNoduplication”的“ienumerable”,其中“ienumerable”不应包含重复记录。我的意思是“BugetType”属性具有相同值的记录应该只采用这些记录中的第一个,并跳过“BugetType”属性具有相同值的其他记录。该怎么做?

FreelancerProjectsNoduplication = _context.FreelancerProjects.GroupBy(f => f.BugetType).Where(g => g.Count() > 1).SelectMany(g => g),

【问题讨论】:

  • 我会看到的..谢谢

标签: c# asp.net linq


【解决方案1】:

您只需使用this overload of Distinct即可做到这一点。

以这个类为例:

public class Student 
{
  public string Name { get; set; }
  public int Age { get; set; }
}

您可以定义一个相等比较器,以便按名称比较 Student 的实例(也就是说,当且仅当 Name 的两个实例具有相同的值时,它们才被视为相等):

  public class StudentComparerByName : IEqualityComparer<Student>
  {
    public bool Equals(Student x, Student y)
    {
      if (x == null && y == null) 
      {
        return true;
      }

      if (x == null || y == null)
      {
        return false;
      }

      return string.Equals(x.Name, y.Name);
    }

    public int GetHashCode(Student obj)
    {
      if (obj == null)
        throw new ArgumentNullException(nameof(obj));

      return obj.Name?.GetHashCode() ?? 0;
    }
  }

然后您可以将自定义相等语义与 LINQ Distinct 扩展方法一起使用:

public static class Program
{
    public static void Main(string[] args)
    {
      var students = new[]
      {
        new Student { Name = "Enrico", Age = 32 },
        new Student { Name = "Alice", Age = 18 },
        new Student { Name = "Enrico", Age = 40 }
      };

      foreach (var student in students.Distinct(new StudentComparerByName()))
      {
        Console.WriteLine($"{student.Name} is {student.Age}");
      }

      Console.ReadLine();
    }
  }

上面的程序打印:

Enrico is 32
Alice is 18

正确实现接口 IEqualityComparer 的指南是可用的here

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多