通过保持顺序和相关性,将相似的记录分组在一个列表中

本文关键字:列表 一个 记录 顺序 相关性 相似 | 更新日期: 2023-09-27 18:11:20

我正在用更清晰的样本数据重新表述问题,以帮助成员更好地理解我的问题。

我已经使用linq相当基本的查询,但不知道如何编写复杂的查询。列表中有这样的数据

var list = new List<Users>()
{ 
  new Users() { FirstName = "John", LastName= "Doe", MiddleName = "P.", Phone = "111-111-111", Email = "abc@xyz.com" },      
  new Users() { FirstName = "Alex", LastName= "Jones", MiddleName = "S", Phone = "333-333-222", Email = "xyz@abc.com" },   
  new Users() { FirstName = "John", LastName= "Doe", MiddleName = "p.", Phone = "111-111-111", Email = "abc@xyz.com" },   
  new Users() { FirstName = "John", LastName= "Doe", MiddleName = "", Phone = "111-222-111", Email = "abc@xyz.com" },   
  new Users() { FirstName = "John", LastName= "", MiddleName = "", Phone = "111-111-111", Email = "abc@xyz.com" },   
  new Users() { FirstName = "Alex", LastName= "James", MiddleName = "N", Phone = "111-111-111", Email = "cde@xyf.com" },   
  new Users() { FirstName = "Alex", LastName= "Jones", MiddleName = "S", Phone = "333-333-222", Email = "xyz@abc.com" },   
  new Users() { FirstName = "John", LastName= "Doe", MiddleName = "", Phone = "111-222-111", Email = "" }, 
};

这些只是用户的样本记录,有成千上万这样的记录。我想对用户进行排序/分组,这样对于单个用户(FirstName, LastName),最多的记录将是那些FirstName, LastName, midlename, Phone和Email匹配的记录。在这些记录之后,需要出现FirstName, LastName, midlename和Phone匹配的记录。所以匹配列最多的行在上面,匹配列最少的行在下面。单个用户的行不应该与其他用户重叠,这样类似用户的记录就会放在一起。

我已经试过了:

我使用了下面的Linq查询来达到预期的结果,

obj = obj.OrderBy(x => (chkFirstName.Checked) ? x.FIRSTNAME : "")
                               .ThenBy(x => (chkLastName.Checked) ? x.LASTNAME : "")
                               .ThenBy(x => (chkMiddleName.Checked) ? x.MIDDLENAME : "")
                               .ThenBy(x => (chkPhone.Checked) ? x.PHONE_PRIMARY : "")
                               .ThenBy(x => (chkEmail.Checked) ? x.EMAIL1 : "").ToList();

它没有给我正确的订单。例如,这个查询将对一个用户的大多数匹配列进行分组,然后对另一个用户的记录进行分组。我在想,也许是集团可以做到这一点?请引导我通过这个。

(注):列表中有我没有提到的额外列,但它们不会用于任何排序或分组。

通过保持顺序和相关性,将相似的记录分组在一个列表中

您可以通过

var sorted = list.OrderBy(l => l.FirstName).ThenBy(l => l.LastName).ThenBy(l => l.MiddleName).ToList();
var result = list.OrderBy(t => t.FirstName).ThenBy(t => t.LastName).ThenBy(t => t.MiddleName);