使用 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 项将如下所示:
- 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
然后当这个列表被过滤时(可能使用扩展方法)它会显示为:
- 123456, 1234, 2018-03-16 20:17:002
- 654321, 4321, 2018-03-16 20:17:004
有人可以告诉我如何实现吗?
尝试使用 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();
}
我关注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 项将如下所示:
- 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
然后当这个列表被过滤时(可能使用扩展方法)它会显示为:
- 123456, 1234, 2018-03-16 20:17:002
- 654321, 4321, 2018-03-16 20:17:004
有人可以告诉我如何实现吗?
尝试使用 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();
}