我有一个我读过的CSV文件并从中获取3个值。值为:name, date, volume
。
我想执行以下操作,阅读文件并将其写入List<T>
,但稍作修改。对于CSV文件中的每个项目,我想检查List<T>
是否已包含name
和date
的行。如果是这样,我希望列表中的volume
增加+1,如果不是,则必须将csv文件中的行添加到List<T>
volume = 1
基本上我想要这样的东西。
List<T> CsvList = new List<T>();
foreach (var item in CSV)
{
object o = new object(item.name, item.date, item.volume)
if(CsvList.name.contains(o.name) && CsvList.date.contains(o.date){
//Increase the volume of the item in the CsvList where name == o.name and date == o.date;
}
}
这是否可以仅在C#应用程序中实现。我可以将它写入数据库并检查该数据库是否存在这些值,但我不想对数据库执行此操作。
答案 0 :(得分:3)
我建议使用GroupBy
linq扩展名。
将它们分组(名称,日期)并计算体积计数
CSV.GroupBy(x=> new {x.name, x.date})
.Select(x=> new object(x.Key.name, x.Key.date, x.Sum(s=> s.volume)))
// I'm not sure are you referring to system.object? use appropriate type.
// or remove object so that you will have an anonymous object.
.ToList();
答案 1 :(得分:1)
根据我对这个问题的理解,这里有:
计算次数
如果您只是想知道某个项目发生的频率,可以使用Dictionary
一些密钥。密钥可以是Tuple<string, string>
或其他任何IEquatable
(实现Equals
和GetHashCode
)。
e.g:
Dictionary<Tuple<string, string>, int> dict;
int count;
var key = new Tuple<string, string>(name, date);
dict.TryGetValue(key, out count); // defaults to 0.
dict[key] = count + 1;
查找&amp;变化强>
同样,如果你想修改类T
(注意:它不能是结构!),你可以使用Dictionary<Tuple<string, string>, T>
并存储Name
和{{1}在词典中。
此外,您可能希望添加Date
之类的条件,因此您知道T具有可用于更改的属性或方法。
这样的事情:
public class CsvReader<T> where T : ISomeInterfaceAllowingModification