0

type_1 の 2 つと type_2 の 1 つの 3 つのアイテムを含むリストがあります。存在するその型の型と数を含む 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; }
}
4

2 に答える 2

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)であるため、タイプのセットが非常に多い場合、これは適切にスケーリングされない可能性があります。その場合は、Saeedのグループ化の提案をお勧めします。

于 2012-08-13T20:23:14.000 に答える
2

できるよ:

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

for ループを使用する場合は、これを実現するために linqCount関数を使用することをお勧めします。Contains を使用する場合は、使用した方法で equal 演算子を実装する必要があります。

于 2012-08-13T20:19:00.507 に答える