C#检查List <t>中的项是否存在,如果存在则递增

时间:2016-06-06 08:23:19

标签: c# list

我有一个我读过的CSV文件并从中获取3个值。值为:name, date, volume

我想执行以下操作,阅读文件并将其写入List<T>,但稍作修改。对于CSV文件中的每个项目,我想检查List<T>是否已包含namedate的行。如果是这样,我希望列表中的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#应用程序中实现。我可以将它写入数据库并检查该数据库是否存在这些值,但我不想对数据库执行此操作。

2 个答案:

答案 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(实现EqualsGetHashCode)。

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