Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 查找/统计列表中的冗余记录<;T>;_Linq_C# 4.0_Data Structures - Fatal编程技术网

Linq 查找/统计列表中的冗余记录<;T>;

Linq 查找/统计列表中的冗余记录<;T>;,linq,c#-4.0,data-structures,Linq,C# 4.0,Data Structures,我正在寻找一种识别重复记录的方法…只有我想/期望看到它们 因此,这些记录并没有完全复制,而是我目前不关心的唯一字段。我只是想看看他们是否通过同一张卡向同一个人支付了同样金额的X#款项。(仅用于说明的虚假示例) 集合是一个列表,无论X是什么列表。计数将是X。换句话说,列表中的所有记录都匹配(同样只是我关心的字段),否则我将拒绝它 我能想出的最好办法就是拿第一个记录get值say payamunt和LINQ,另外两个,看看它们是否有相同的payamum值。对要匹配的所有字段重复此操作。这似乎效率极低

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

因此,这些记录并没有完全复制,而是我目前不关心的唯一字段。我只是想看看他们是否通过同一张卡向同一个人支付了同样金额的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()
            };