我有以下的observevale集合,它完美地运作:
Persons = new ObservableCollection<Person>();
foreach (string line in lines)
{
var column = line.Split(',');
var name = column[0];
int score = int.Parse(column[1].ToString());
var person = Persons.FirstOrDefault(x => x.Name == name);
if (person == null)
{
var newPerson = new Person(name, score);
Persons.Add(newPerson);
}
else
{
person.Score += score;
}
datagrid.ItemsSource = Persons;
}
我在这里做的是我首先从一个CSV文件中读取,该文件有两列,名称和分数。我想要做的是浏览CSV文件并获得相似名称的得分总和。
例如,我的CSV如下表所示:
Name, score
Jo,1
Hannah,2
Sara,1
Jo,2
Sara,3
Fred,1
当我运行我的代码时,我得到以下结果,这正是我想要的:
Jo,3
Hannah,2
Sara,4
Fred,1
我要做的另一件事是计算多少&#34; Jo&#34;我们有多少&#34; Hannah&#34;我们有多少&#34; Sara&#34;我们有多少&#34;弗雷德&#34;我们有。我知道,因为名称存储在ObservableCollection,Persons中,所以我想计算ObservableCollection中有多少元素,因为我只计算相同的名称。所以为了做到这一点,我使用了ObservableCollection的count属性。所以我这样做了:
Persons.Count;
但是这一直在回归1.我想也许我需要把它放在循环之外,但我得到同样的东西。
我的问题是,为什么伯爵的表现如此?我用错了吗?难道不计算ObservableCollection中的所有元素吗?
答案 0 :(得分:1)
要获取CSV文件中的人数,您可以使用Count()
:
var personName = "Jo";
var count = lines.Count(l => l.Split(',')[0] == personName);
现在,您的文件中已计入"Jo"
;
答案 1 :(得分:1)
为什么伯爵的表现如此?
Count假设返回集合中的项目数。
我使用它错了吗?
根据您的期望,是的。
难道不计算ObservableCollection中的所有元素吗?
是的。您正在将分组的项目添加到集合中,因此每个名称只会有一个。
使用linq进行演示。
假设lines
成立
Name, score
Jo,1
Hannah,2
Sara,1
Jo,2
Sara,3
Fred,1
以下内容返回保存已解析数据的匿名对象
var data = lines.Skip(1).Select(line => {
var column = line.Split(',');
var name = column[0];
int score = int.Parse(column[1]);
return new { name, score };
});
对数据进行分组可以汇总分数以及每个名称的存在数量
var groupedData = data.GroupBy(p => p.name)
.Select(g => new { name = g.Key, score = g.Sum(p => p.score), count = g.Count() });
//eg
//Jo,3,2
//Hannah,2,1
//Sara,4,2
//Fred,1,1
从那里你应该能够创建你想要的对象,包括每个名字的存在数量。
var persons = groupedData.Select(p => new Person(p.name, p.score) { Count = p.count });
现在可以将人员添加到收藏中。
foreach (var person in persons) {
Persons.Add(person);
}
datagrid.ItemsSource = Persons;