数数 of Duplicates

Webkill.

新成员
加入
2018年3月19日
消息
2
编程经验
10+
我有一个过程解析一个相当丑陋的文本文件(实际上很多),并将记录填充到自定义类的列表中设置,与我将SQL批量复制到一个表中的字段的名称转换为a数据表。它很好,但是在审查数据后,它看起来我们有一个重复记录的新要求。这些记录表示操作,并且有重复的是,遗憾的是每个重复记录都是真正的重复,没有什么可以将其分开,因此而不是列出两次(或更多)的相同记录,而不是列出多少它发生的时间。这也将允许我在表上设置主键,因为不会争辩到。

当我读取文件的行时,我用页脚记录停止,并使用所需的数据填充我的类记录,并将其插入该类列表中。当文件完成处理时,然后将完成的类记录列表转换为数据表。

我的问题是:有没有简单的方式填充字段"Count"在我的课程中具有记录出现的次数,在列表完成之后,或转换为DataTable之后?

我有这样的东西:
List<MyRecord> records = new List<MyRecord>();

var read = File.ReadAllLines(FILE);
var lines = new List<string>(read);

foreach (string line in lines)
{
    if (line.Contains("ENDREC"))
    {
        records.add(new MyRecord(Data1, Data2, Data3, "1")); //the 1 would be the count, defaulting to 1
    }
}

DataTable table = ConvertToDataTable(records); //uses a function I wrote to convert the list to a datatable


public class MyRecord
{
    public string Data1 { get; set; }
    public string Data2 { get; set; }
    public string Data3 { get; set; }
    public int Count { get; set; }

    //constructor here
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,683
地点
悉尼,澳大利亚
编程经验
10+
您可以使用HashSet而不是列表,以确保在列表中添加任何重复项。您可以指定您对平等的测试,以便仅使用DATAN属性。拒绝重复后,您可以获取现有项目并递增其计数。此代码未经测试,但应告诉您如何实现这些步骤的想法:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var things = new HashSet<Thing>(new ThingEqualityComparer());

            foreach (var line in File.ReadLines("file path here"))
            {
                var record = new Thing {Data1 = "Data1", Data2 = "Data2", Data3 = "Data3", Count = 1};

                if (!things.Add(record))
                {
                    // This record is a duplicate so get the existing record and increment the count.
                    record = things.Single(t => things.Comparer.Equals(t, record));
                    record.Count++;
                }
            }
        }
    }

    class Thing
    {
        public string Data1 { get; set; }
        public string Data2 { get; set; }
        public string Data3 { get; set; }
        public int Count { get; set; }
    }

    class ThingEqualityComparer : IEqualityComparer<Thing>
    {
        public bool Equals(Thing x, Thing y)
        {
            return x.Data1 == y.Data2 &&
                   x.Data2 == y.Data2 &&
                   x.Data3 == y.Data3;
        }

        public int GetHashCode(Thing obj)
        {
            return string.Join(Environment.NewLine, obj.Data1, obj.Data2, obj.Data3).GetHashCode();
        }
    }
}

另请注意,我使用ReadLines而不是readalllines。除非您真正需要数组中的所有行以进行随机或重复访问,否则前者是优选的。如果顺序,奇异访问是您需要的,那么ReadLines更有效,尤其是大文件。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,683
地点
悉尼,澳大利亚
编程经验
10+
你的意思是把string.con用于gethashcode?

不,我的意思是加入。它更有可能产生独特的价值。使用concat,"A", "BCD" and "E"会产生相同的哈希码"AB", "C" and "DE",虽然它们不会使用与分隔符的行中断。
 
最佳 底部