2016-09-25 21 views
0

我有一個像下面列出的列表,我需要在出現次數中更新時間的發生次數,它不僅僅是獲得列表中字符串的總髮生次數,假設Group1出現第二次出現次數該項目的計數應該更新爲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 

我currrent代碼

 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

我是否正確地理解這一點:如果你向列表中插入一個'Category'列表,該列表中的另一個'Category'實例已經擁有了'Name'字符串,那麼你想增加該Category的OccuranceCount?你是否希望將這兩個類別都保留在列表中? – cubrr

+0

「有沒有更好的方法」您能*顯示*您當前的方法嗎?很難得到你的想法。 – HimBromBeere

+0

@HimBromBeere添加了代碼。 – user6634447

回答

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; 
相關問題