使用 LINQ 区分列表中的项目

Distinct items in List using LINQ

我关注class:

public class CustomerDTO
    {
            public string CardNumber { get; set; }
            public string CustomerNumber { get; set; }        
            public DateTime FetchedDate { get; private set; } = DateTime.Now;
    }

这个 class 被添加到列表中

    var duplicateCustomers = new List<CustomerDTO>
                {
                    new CustomerDTO { CardNumber = "123456", CustomerNumber = "1234" },
                    new CustomerDTO { CardNumber = "123456", CustomerNumber = "1234" },
                    new CustomerDTO { CardNumber = "654321", CustomerNumber = "4321" },
                    new CustomerDTO { CardNumber = "654321", CustomerNumber = "4321" }
                };

我想要实现的是将此列表过滤为不同的项目,因此只有四个项目中的两个,并确保重复条目的 FetchedDate 字段是最大的。

因此上面列表中的所有 4 项将如下所示:

然后当这个列表被过滤时(可能使用扩展方法)它会显示为:

有人可以告诉我如何实现吗?

尝试使用 GroupBy:

duplicateCustomers = duplicateCustomers.GroupBy(item => new 
{
    CardNumber = item.CardNumber,
    CustomerNumber = item.CustomerNumber
})
.Select(item => new CustomerDTO()
{
    CardNumber = item.Key.CardNumber,
    CustomerNumber = item.Key.CustomerNumber,
    FetchedDate = item.Max(m => m.FetchedDate)
})

试试这个:

var results = duplicateCustomers
     .GroupBy(c => new { c.CardNumber, c.CustomerNumber })
     .Select(d => d.OrderByDescending(e => e.FetchedDate)
     .First())
     .ToList();

基本上我在这里所做的是使用 GroupBy select 基于两个属性 CardNumber 和 CustomerNumber 来区分列表中的项目。然后 select 项目结果中的第一个结果。

您可以尝试下面的代码,它将满足您的要求

 static void Main(string[] args)
        {
            var duplicateCustomers = new List<CustomerDTO>
                {
                    new CustomerDTO { CardNumber = "123456", CustomerNumber = "1234" },
                    new CustomerDTO { CardNumber = "123456", CustomerNumber = "1234" },
                    new CustomerDTO { CardNumber = "654321", CustomerNumber = "4321" },
                    new CustomerDTO { CardNumber = "654321", CustomerNumber = "4321" }
                };
           // var nonduplicates= duplicateCustomers.Distinct(x => x.).ToList();//duplicateCustomers.Select(x => x.CustomerNumber).Distinct().ToList();
            List<CustomerDTO> distinctCustomers = duplicateCustomers
   .GroupBy(p => p.CardNumber)
   .Select(g => g.FirstOrDefault())
   .ToList();
            foreach (var item in distinctCustomers)
            {
                Console.WriteLine("Details  "+item.CardNumber +" "+ item.CustomerNumber + "   "+item.FetchedDate);
                //Console.WriteLine("cust Number" + item.CustomerNumber);
            }

            Console.ReadLine();
        }