计算ObservableCollection

时间:2017-07-02 10:07:05

标签: c# csv observablecollection

我有以下的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中的所有元素吗?

2 个答案:

答案 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;