C# 使用Contains()list方法计算列表内容

C# 使用Contains()list方法计算列表内容,c#,visual-studio-2010,list,find,contains,C#,Visual Studio 2010,List,Find,Contains,我有一个包含3个项目的列表,两个类型为_1,一个类型为_2。我想返回第二个列表,其中包含存在的该类型的类型和编号。当单步执行foreach循环中设置的断点时,IF语句永远不会为true。我假设我尝试使用Contains()方法时出错 输出应该类似于: type_1 2 type_2 1 相反,它的计算结果是: type_1 1 type_1 1 type_2 1 我对Contains()的使用是否不正确 public List<item_coun

我有一个包含3个项目的列表,两个类型为_1,一个类型为_2。我想返回第二个列表,其中包含存在的该类型的类型和编号。当单步执行foreach循环中设置的断点时,IF语句永远不会为true。我假设我尝试使用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; }
}
公共列表QueryGraphListingsNewAccountReport()
列表结果=新列表();
var type_item1=新项目{account_type=“type_1”};
var type_item2=新项目{account_type=“type_1”};
var type_item3=新项目{account_type=“type_2”};
结果。添加(类型_项1);
结果。添加(类型_项2);
结果。添加(类型_项3);
//创建一个空列表,其中包含帐户类型以及该类型存在的数量:
列表结果_计数=新列表();
foreach(结果中的var项目)
{  
if(result_count.Contains(new item_count{account_type=item.account_type,count=1})=true)
{
var result\u item=result\u count.Find(x=>x.account\u type==item.account\u type);
结果_item.count+=1;
结果计数。添加(结果项);
}
其他的
{
var result_item=new item_count{account_type=item.account_type,count=1};
结果计数。添加(结果项);
}   
}
返回结果_计数;
}
公共类项目
{
公共字符串帐户类型{get;set;}
}
公共类项目计数
{
公共整数计数{get;set;}
公共字符串帐户类型{get;set;}
}
您可以执行以下操作:

myList.GroupBy(x=>x.type).Select(x=>new {x.Key, x.Count()});
如果要使用for循环,最好使用linq
Count
函数来实现此功能,如果要使用Contains,则应按照使用的方式实现相等运算符。

您可以执行以下操作:

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

如果您想使用for循环,最好使用linq
Count
函数来实现这一点,如果您想使用Contains,您应该按照您使用的方式实现相等运算符。

我认为您的问题是根本不想使用Contains。您正在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的分组建议。

我认为你的问题是你根本不想使用contains。您正在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的linq使用—这就成功了!非常感谢!目前,我将使用此方法,因为这只是一个概念验证,所以规模相当小,但稍后我将研究如何实现Saeed的linq使用