在通用列表中出现字符串

时间:2016-09-25 16:06:27

标签: c# .net linq generics

我有一个如下所列的列表,我需要在发生次数中更新时间的发生次数,它不仅仅是在列表中总计出现字符串,假设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);
        }

1 个答案:

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