2012-08-13 35 views
0

我有一個列表,其中包含3個項目,兩個type_1和一個type_2。我想返回第二個列表,其中包含存在的類型和編號。當逐步遍歷在foreach循環處設置的斷點時,IF語句永遠不會成立。我假設我嘗試使用Contains()方法時出現問題。使用Contains()列表方法評估列表內容

輸出應該是這樣的:

type_1 2 
type_2 1 

相反,它的計算結果爲:

type_1 1 
type_1 1 
type_2 1 

是我使用包含()不正確嗎?

public List<item_count> QueryGraphListingsNewAccountReport() 

    List<item> result = new List<items>(); 

    var type_item1 = new item { account_type = "Type_1" }; 
    var type_item2 = new item { account_type = "Type_1" }; 
    var type_item3 = new item { account_type = "Type_2" }; 

    result.Add(type_item1); 
    result.Add(type_item2); 
    result.Add(type_item3); 

//Create a empty list that will hold the account_type AND a count of how many of that type exists: 

    List<item_count> result_count = new List<item_count>(); 

    foreach (var item in result) 
    { 
    if (result_count.Contains(new item_count { account_type = item.account_type, count = 1 }) == true) 
    { 
    var result_item = result_count.Find(x => x.account_type == item.account_type); 
    result_item.count += 1; 
    result_count.Add(result_item); 
    } 
    else 
    { 
    var result_item = new item_count { account_type = item.account_type, count = 1 }; 
    result_count.Add(result_item); 
    } 
    } 
    return result_count; 
} 

public class item 
{ 
    public string account_type { get; set; } 
} 
public class item_count  
{ 
    public int count {get; set;} 
    public string account_type { get; set; } 
} 

回答

2

我認爲你的問題是你根本不想使用contains。您正在包含語句中創建一個新對象,顯然,它已不包含在您的列表中,因爲您只是剛創建它。比較是比較參考,而不是數值。

爲什麼不直接在下一行使用find語句呢?如果它返回null,那麼你知道沒有一個項目已經具有該類型。

所以你可以做這樣的事情:

var result_item = result_count.Find(x => x.account_type == item.account_type); 
if (result_item != null) 
{ 
    result_item.count++; 
    // note here you don't need to add it back to the list! 
} 
else 
{ 
    // create your new result_item here and add it to your list. 
} 

注意:查找是O(n),所以如果你有一個非常大集的類型,這可能不能很好地擴展。在那種情況下,你可能會更好,因爲賽義德的分組建議。

+0

這個伎倆!非常感謝!目前,我將使用這種方法,因爲這只是一個概念證明,所以規模相當小,但我會考慮稍後實施Saeed的linq使用 – aeternus828 2012-08-13 20:41:23

2

你可以這樣做:

myList.GroupBy(x=>x.type).Select(x=>new {x.Key, x.Count()}); 

如果你想使用的循環,這是更好地使用LINQ Count函數來實現這一點,如果你想使用包含你應該實行平等運營商的方式,你用過的。