2015-05-30 61 views
3

我有以下代碼與元組一起工作。輸入是項目列表,輸出是元組列表,我們需要基本計算每個日期的項目數量。在C中使用元組#

List<Tuple<DateTime, int>> list = new List<Tuple<DateTime, int>>(); 
foreach (ItemClass item in items) 
{ 
    foreach(Tuple<DateTime, int> tuple in list) 
    { 
     if (tuple.Item1 == item.date) 
     { 
       tuple.Item2++; 
       continue; 
      } 
    } 
    list.Add(Tuple.Create<DateTime, int>(item.date, 1)); 
} 

此代碼目前不編譯,因爲Item2是隻讀的,問題是如何使它工作?

此前,這與Dictionary一起工作,但我不得不刪除它,因爲它是不可接受的外部代碼與Dictionary一起使用。

+0

你正在創建一個新的元組列表,然後迭代一個空集合?這沒有任何意義。什麼是'tu.date',從哪裏來的? –

+1

元組在設計中是不可變的,所以使用Dictionary(或List )重寫它。 –

+0

你不能引入一個帶有DateTime屬性和int屬性的新類嗎?您不僅可以解決您的不變性問題,還可以獲得更易讀的代碼。 –

回答

7

元組不適用於需要可變性的場景。你可以讓自己的類,它結合了一個可變的整數計數器DateTime,但你也可以做到這一點使用LINQ,在最後轉換成元組的列表:

var list = items 
    .GroupBy(item => item.date) 
    .Select(g => Tuple.Create(g.Key, g.Count())) 
    .ToList(); 

上面的代碼創建一個組每個日期,然後只有當每個組中的項目的最終計數已知時才產生元組。

4

嘗試使用Linq,GroupBy()按日期分組,然後使用Select()併爲每個組創建一個元組,最後使用ToList()轉換爲列表。就像

var result = items.GroupBy(x => x.Date) 
        .Select(x => Tuple.Create(x.Key, x.Count())) 
        .ToList(); 
+0

您忘記了將'List'賦值給一個值。 –

+0

謝謝,大概應該有編譯:) –

-1

我假設因爲它只讀它已經有一個屬性,我想我以前使用過元組所以是的,它可能是。

也許你不能編輯它,因爲你可以在Foreach()循環中編輯迭代器,也許試驗另一種循環。

OR

的ITEM2對象設置爲對象的電流環路和使用,代替迭代器之外。