在列表<t> </t>中查找/计算冗余记录

时间:2012-12-27 01:31:34

标签: linq c#-4.0 data-structures

我正在寻找一种识别重复记录的方法...只有我希望/期望看到它们。

所以这些记录并没有完全重复,而是我此时并不关心的独特字段。我只是想看看他们是否通过完全相同的卡将完全相同金额的X#付款给了完全相同的人。 (Bogus的例子只是为了说明)

该集合是List&lt;&gt;无论X#是什么,List&lt;&gt; .Count都是X#。换句话说,列表中的所有记录都匹配(再次只是我关注的字段)或者我会拒绝它。

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

所以任何想法,想法和指示都会受到高度赞赏。

JB

2 个答案:

答案 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过滤该组仅重复。