加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#用于存储来自csv文件的值的适当数据结构.具体案例

发布时间:2020-12-15 08:14:56 所属栏目:百科 来源:网络整理
导读:我正在编写一个程序,它只会读取包含以下信息的2个不同的.csv文件: file 1 file2AA,2.34 BA,6.45AB,1.46 BB,5.45AC,9.69 BC,6.21AD,3.6 AC,7.56 第一列是字符串,第二列是double. 到目前为止,我没有困难阅读这些文件并将值放入List: firstFile = new ListKey
我正在编写一个程序,它只会读取包含以下信息的2个不同的.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

第一列是字符串,第二列是double.

到目前为止,我没有困难阅读这些文件并将值放入List:

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但是这个数据结构没有排序,也无法通过索引访问密钥.

我不是要求提供确切的代码,而是问题是:

What would you suggest to use as an appropriate data structure for this program so that I can investigate myself further?

解决方法

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();

有必要重写Equals和GetHashCode,否则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为两个文件的行数).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读