【发布时间】:2019-01-29 22:19:21
【问题描述】:
我有一个读取任意 CSV 文件的 c# 程序。列的类型可以是 int、float 或 double。
我目前正在将此数据加载到列表中,有什么方法可以在列之间执行基本的算术运算。 IE。添加两列。如果列的类型不同,我想遵循标准类型提升。
有没有一种简单的方法来实现这一点,是否应该将列封装在一个对象中?
这是一个代码示例,显示了我所追求的行为。由于内存和资源的原因,我确实需要保留单独的类型
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
class Program
{
static void Main(string[] args)
{
List<IList> data = new List<IList>();
data.Add(Enumerable.Range(0, 1000).ToList()); // Add a list of ints
data.Add(Enumerable.Range(0, 1000).Select(v=>(float)v).ToList()); // Add a list of floats
data.Add(Enumerable.Range(0, 1000).Select(v => (double)v).ToList()); // Add a list of doubles
data.Add(GenerateColumn(data[0], data[1], Operation.Add));
data.Add(GenerateColumn(data[1], data[2], Operation.Divide));
}
// This is what I would do if the lists were all the same type
static IList GenerateColumn(IList colA, IList colB,Operation operation)
{
List<double> result = null;
switch (operation)
{
case Operation.Add:
result = colA.Zip(colB, (a, b) => a + b).ToList();
break;
case Operation.Subtract:
result = colA.Zip(colB, (a, b) => a - b).ToList();
break;
case Operation.Multiply:
result = colA.Zip(colB, (a, b) => a * b).ToList();
break;
case Operation.Divide:
result = colA.Zip(colB, (a, b) => a / b).ToList();
break;
}
return result;
}
public enum Operation
{
Add,
Subtract,
Multiply,
Divide
}
}
}
【问题讨论】:
-
你尝试的时候发生了什么?您能否展示代码并具体描述您遇到的错误?
-
我之前使用的是单一数据类型(存储在 List
- > 中),但是我需要处理的一些文件遇到了内存限制(已经加载了 15GB 的数据),以及精度限制。为了解决这个问题,我将主要使用整数和浮点数。
-
像 Alexei 建议的那样使用
dynamic。 -
but with some of the files I need to process ran into memory limitations也许考虑使用yield return或IEnumerable或流等,这样您就不会一次将文件的全部内容都保存在RAM中? -
我确实考虑过使用 IEnumerable,但在将其传递给绘图库之前我需要做一些分析。
标签: c# list generic-list