1

我正在寻找一种方法来识别重复记录……只是我想/期望看到它们。

因此,记录并没有完全复制,而是我目前不关心的唯一字段。我只是想看看他们是否通过完全相同的卡向完全相同的人支付了完全相同金额的 X# 付款。(假的例子只是为了说明)

该集合是一个 List<>,无论 X# 是 List<>.Count 是 X#。换句话说,列表中的所有记录都匹配(同样只是我关心的字段),否则我将拒绝它。

我能想到的最好的办法是获取第一条记录的值,比如 PayAmount 和 LINQ 其他两个,看看它们是否具有相同的 PayAmount 值。重复所有要匹配的字段。这似乎非常低效,但我不够聪明,无法想出更好的方法。

因此,任何想法,想法,指针将不胜感激。

JB

4

2 回答 2

3

像这样的事情应该这样做。

var duplicates = list.GroupBy(x => new { x.Amount, x.CardNumber, x.PersonName })
                     .Where(x => x.Count() > 1);
于 2012-12-27T01:36:39.137 回答
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仅将组过滤为重复项。

于 2012-12-27T01:52:59.420 回答