我有一个如下所列的列表,我需要在发生次数中更新时间的发生次数,它不仅仅是在列表中总计出现字符串,假设Group1出现第二次该项目的发生次数应该更新as 2,如果再次出现特定事件应该更新为3.这可以使用循环完成并根据组的出现增加计数,有没有更好的方法使用linq或其他技术来做到这一点。
例如,使用以下列表:
public class Category
{
public long Id { get; set; }
public string Name { get; set; }
public int OccuranceCount { get; set; }
}
static void Main(string[] args)
{
var categories = new List<Category>
{
new Category {Id = 1, Name = "Group"},
new Category {Id = 1, Name = "Group2"},
new Category {Id = 1, Name = "Group1"},
new Category {Id = 1, Name = "Group2"},
new Category {Id = 1, Name = "Group"},
new Category {Id = 1, Name = "Group3"},
new Category {Id = 1, Name = "Group"}
};
Console.ReadKey();
}
我需要输出这样的内容:
Name Occurrence Count
Group 0
Group2 0
Group1 0
Group2 1
Group 1
Group3 0
Group 2
我的代码
foreach (var category in categories)
{
var selectedCategory = categories.Where(x => x.Name.Equals(category.Name));
category.OccuranceCount =
categories.Where(x => x.Name.Equals(category.Name)).Max(x => x.OccuranceCount) + 1;
}
foreach (var category in categories)
{
Console.WriteLine("Name : {0}, OccuranceCount {1}",category.Name, category.OccuranceCount);
}
答案 0 :(得分:0)
你可以使用LINQ GroupBy
结合花哨Select
重载索引,但由于你需要更新条目,IMO最好的时间和空间复杂性将是使用简单的计数字典:
var counts = new Dictionary<string, int>();
foreach (var category in categories)
{
int count;
counts.TryGetValue(category.Name, out count);
counts[category.Name] = category.OccuranceCount = ++count;
}
记录中,这是LINQ版本:
foreach (var group in categories.GroupBy(c => c.Name))
foreach (var item in group.Select((category, index) => new { category, index }))
item.category.OccuranceCount = item.index + 1;