Linq 查找/统计列表中的冗余记录<;T>;
我正在寻找一种识别重复记录的方法…只有我想/期望看到它们 因此,这些记录并没有完全复制,而是我目前不关心的唯一字段。我只是想看看他们是否通过同一张卡向同一个人支付了同样金额的X#款项。(仅用于说明的虚假示例) 集合是一个列表,无论X是什么列表。计数将是X。换句话说,列表中的所有记录都匹配(同样只是我关心的字段),否则我将拒绝它 我能想出的最好办法就是拿第一个记录get值say payamunt和LINQ,另外两个,看看它们是否有相同的payamum值。对要匹配的所有字段重复此操作。这似乎效率极低,但我还没有聪明到想出更好的办法 因此,任何想法、想法和建议都将不胜感激Linq 查找/统计列表中的冗余记录<;T>;,linq,c#-4.0,data-structures,Linq,C# 4.0,Data Structures,我正在寻找一种识别重复记录的方法…只有我想/期望看到它们 因此,这些记录并没有完全复制,而是我目前不关心的唯一字段。我只是想看看他们是否通过同一张卡向同一个人支付了同样金额的X#款项。(仅用于说明的虚假示例) 集合是一个列表,无论X是什么列表。计数将是X。换句话说,列表中的所有记录都匹配(同样只是我关心的字段),否则我将拒绝它 我能想出的最好办法就是拿第一个记录get值say payamunt和LINQ,另外两个,看看它们是否有相同的payamum值。对要匹配的所有字段重复此操作。这似乎效率极低
JB像这样的东西应该可以做到
var duplicates = list.GroupBy(x => new { x.Amount, x.CardNumber, x.PersonName })
.Where(x => x.Count() > 1);
工作示例:
class Program
{
static void Main(string[] args)
{
List<Entry> table = new List<Entry>();
var dup1 = new Entry
{
Name = "David",
CardNumber = 123456789,
PaymentAmount = 70.00M
};
var dup2 = new Entry
{
Name = "Daniel",
CardNumber = 987654321,
PaymentAmount = 45.00M
};
//3 duplicates
table.Add(dup1);
table.Add(dup1);
table.Add(dup1);
//2 duplicates
table.Add(dup2);
table.Add(dup2);
//Find duplicates query
var query = from p in table
group p by new { p.Name, p.CardNumber, p.PaymentAmount } into g
where g.Count() > 1
select new
{
name = g.Key.Name,
cardNumber = g.Key.CardNumber,
amount = g.Key.PaymentAmount,
count = g.Count()
};
foreach (var item in query)
{
Console.WriteLine("{0}, {1}, {2}, {3}", item.name, item.cardNumber, item.amount, item.count);
}
Console.ReadKey();
}
}
public class Entry
{
public string Name { get; set; }
public int CardNumber { get; set; }
public decimal PaymentAmount { get; set; }
}
您的唯一条目基于姓名、卡号和付款金额这三个标准,因此您可以根据它们进行分组,然后使用
.Count()
计算这些唯一值中存在的数量其中g.Count()>1
仅将组筛选为重复组。。将分组筛选器添加到列表中,然后计数。基本上就是我在TSQL中所做的。我真的需要跟上LINQ的进度。
var query = from p in table
group p by new { p.Name, p.CardNumber, p.PaymentAmount } into g
where g.Count() > 1
select new
{
name = g.Key.Name,
cardNumber = g.Key.CardNumber,
amount = g.Key.PaymentAmount,
count = g.Count()
};