我正在编写一个程序,它将只读取包含以下信息的两个不同的.csv文件:

file 1                  file2
AA,2.34                BA,6.45
AB,1.46                BB,5.45
AC,9.69                BC,6.21
AD,3.6                 AC,7.56

其中第一列是string,第二列是double
到目前为止,我在读取这些文件并将值放入列表中时没有遇到任何困难:
firstFile = new List<KeyValuePair<string, double>>();
secondFile = new List<KeyValuePair<string, double>>();

我正试图指导我的课程:
从第一个文件的第一行的第一列获取第一个值(在本例中为AA
看看第二个文件的第一列是否匹配。
如果找到字符串匹配,则比较它们对应的第二个值(在本例中为double),如果在本例中找到匹配,则将整行添加到单独的List
类似于下面的伪代码:
for(var i=0;i<firstFile.Count;i++)
{
    firstFile.Column[0].value[i].SearchMatchesInAnotherFile(secondFile.Column[0].values.All);
    if(MatchFound)
    {
        CompareCorrespondingDoubles();
        if(true)
        {
            AddFirstValueToList();
        }
    }
}

我试图使用List而不是Dictionary,但是这个数据结构没有排序,并且无法通过索引访问键。
我不是要求提供确切的代码,而是要问:
你有什么建议可以作为这个程序的适当数据结构,以便我可以进一步调查自己?

最佳答案

KeyValuePair实际上只用于Dictionarys。我建议您创建自己的自定义类型:

public class MyRow
{
    public string StringValue {get;set;}
    public double DoubleValue {get;set;}

    public override bool Equals(object o)
    {
         MyRow r = o as MyRow;
         if (ReferenceEquals(r, null)) return false;
         return r.StringValue == this.StringValue && r.DoubleValue == this.DoubleValue;
    }
    public override int GetHashCode()
    {
        unchecked { return StringValue.GetHashCode ^ r.DoubleValue.GetHashCode(); }
    }
}

并将文件存储在此类型的列表中:
List<MyRow> firstFile = ...
List<MyRow> secondFile = ...

然后,您可以通过linq的Intersect方法确定交集(两个列表中出现的所有元素):
var result = firstFile.Intersect(secondFile).ToList();

必须重写EqualsGetHashCode,否则Intersect只会进行引用比较。另外,您可以实现自己的IEqualityComparer<MyRow, MyRow>来进行比较,并将其传递给适当的Intersect重载。
但是,如果可以确保键(字符串值是唯一的),也可以使用
Dictionary<string, double> firstFile = ...
Dictionary<string, double> secondFile = ...

在本例中,使用以下linq语句:
var result = new Dictionary<string, double>(
          firstFile.Select(x => new { First = x, Second = secondFile.FirstOrDefault(y => x.Key == y.Key) })
                   .Where(x => x.Second?.Value == x.First.Value));

它具有O(m+n)的时间复杂度,而上解是O(m*n)(对于m和n是两个文件的行计数)。

关于c# - C#适当的数据结构,用于存储csv文件中的值。具体情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50002808/

10-11 22:36
查看更多