0

我有一个包含 3 个项目的列表,两个 type_1 和一个 type_2。我想返回第二个列表,其中包含存在的该类型的类型和编号。当单步执行在 foreach 循环中设置的断点时,IF 语句永远不会为真。我认为我尝试使用 Contains() 方法有问题。

输出应该是这样的:

 type_1    2
 type_2    1

相反,它评估为:

 type_1    1
 type_1    1
 type_2    1

我对 Contains() 的使用不正确吗?

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; }
}
4

2 回答 2

2

你可以做:

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

如果你想使用for循环,最好使用linqCount函数来实现,如果你想使用包含你应该按照你使用的方式实现等于运算符。

于 2012-08-13T20:19:00.507 回答
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.
}

注意:Find 是 o(n),所以如果你有大量类型,这可能无法很好地扩展。在这种情况下,你可能会更好地接受 Saeed 的分组建议。

于 2012-08-13T20:23:14.000 回答