2012-08-13 71 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函数来实现这一点,如果你想使用包含你应该实行平等运营商的方式,你用过的。