我正在寻找一种识别重复记录的方法...只有我希望/期望看到它们。
所以这些记录并没有完全重复,而是我此时并不关心的独特字段。我只是想看看他们是否通过完全相同的卡将完全相同金额的X#付款给了完全相同的人。 (Bogus的例子只是为了说明)
该集合是List<>无论X#是什么,List<> .Count都是X#。换句话说,列表中的所有记录都匹配(再次只是我关注的字段)或者我会拒绝它。
我能想到的最好的方法是拿第一个记录获得PayAmount和其他两个LINQ的值,看看它们是否具有相同的PayAmount值。重复所有要匹配的字段。这似乎非常低效,但我不够聪明,想到一个更好的方法。
所以任何想法,想法和指示都会受到高度赞赏。
JB
答案 0 :(得分:3)
这样的事情应该这样做。
var duplicates = list.GroupBy(x => new { x.Amount, x.CardNumber, x.PersonName })
.Where(x => x.Count() > 1);
答案 1 :(得分:0)
工作示例:
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; }
}
肉是这样的:
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()
};
您的唯一条目基于名称,卡号和付款金额的3个条件,因此您按其分组,然后使用.Count()
计算存在多少个唯一值。 where g.Count() > 1
过滤该组仅重复。