1

重複レコードを特定する方法を探しています...私だけがそれらを見たい/期待しています。

したがって、レコードは完全には複製されませんが、この時点では私が気にしない一意のフィールドです。まったく同じカードを使用して、まったく同じ人にまったく同じ金額の X# 支払いを行ったかどうかを確認したいだけです。(説明のための偽の例)

コレクションは List<> であり、さらに X# が List<>.Count である場合は X# になります。言い換えれば、リスト内のすべてのレコードが一致する (ここでも関係のあるフィールドのみ) か、拒否します。

私が思い付くことができる最善の方法は、PayAmount と LINQ などの最初のレコード get 値を取得して、それらが同じ 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 に答える