-3

I have following class:

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

This class gets added to a List as so

    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" }
                };

What i want to achieve is have this list filtered to distinct items so just have 2 of the four items & ensuring the FetchedDate field of the duplicate entries is the MAX one.

So all 4 items in above list would appear like following:

  • 123456, 1234, 2018-03-16 20:17:001
  • 123456, 1234, 2018-03-16 20:17:002
  • 654321, 4321, 2018-03-16 20:17:003
  • 654321, 4321, 2018-03-16 20:17:004

Then when this list is filtered (using an extension method perhaps) it would appear as so:

  • 123456, 1234, 2018-03-16 20:17:002
  • 654321, 4321, 2018-03-16 20:17:004

Could someone show me how to achieve this?

AdrianSean
  • 397
  • 1
  • 5
  • 21
  • 1
    Possible duplicate of [LINQ's Distinct() on a particular property](https://stackoverflow.com/questions/489258/linqs-distinct-on-a-particular-property) – M.Hassan Mar 16 '18 at 20:36

3 Answers3

0

Try using 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)
})
Kevin K.
  • 1,327
  • 2
  • 13
  • 18
0

Try this:

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

Basically what I am doing here is using GroupBy to select distinct items on your list based on two properties, CardNumber and CustomerNumber. Then select the first results in the item results.

Willy David Jr
  • 8,604
  • 6
  • 46
  • 57
0

You can try below code it will work for your requirement

 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();
        }
Khadar
  • 79
  • 6