2012-01-26 10 views
1

私は2つのパブリック変数を含むカスタムクラスを持っています.1は文字列、1は整数です。リスト内にこのクラスのリストを作成します。クラスの文字列が一意である必要があります。文字列がすでにリストに存在する場合は、再度追加する必要はありませんが、対応する整数を組み合わせたいと思います。ここにカスタムクラスとリストの例があります。私はそれが既に存在するかどうかを確認するには、リスト上の機能が含まれていますが、文字列の両方の場合にのみtrueを返し、を使用している鉛筆7を、消しゴム4:私はそれにしたい最終的なリストが含まれているためにそうリスト内のオブジェクトの1つの要素を比較していますか?

public class myItems 
{ 
    public string itemName; 
    public int count; 
} 

List<myItems> items = new List<myItems>(); 

myItems e = new myItems(); 
e.symbol = "pencil"; 
e.count = 3; 
items.Add(e); 

myItems e1 = new myItems(); 
e1.symbol = "eraser"; 
e1.count = 4; 
items.Add(e1); 

myItems e2 = new myItems(); 
e1.symbol = "pencil"; 
e1.count = 3; 
items.Add(e5); 

整数は同じです。

文字列にのみ一致する方法はありますか?

答えて

2

それはLINQを使用することです行う別の方法:

public class myItems 
{ 
    public string itemName; 
    public int count; 
} 

List<myItems> items = new List<myItems>(); 

myItems e = new myItems(); 
e.symbol = "pencil"; 
e.count = 3; 
Add(items, e); 

myItems e1 = new myItems(); 
e1.symbol = "eraser"; 
e1.count = 4; 
Add(items, e1); 

myItems e2 = new myItems(); 
e1.symbol = "pencil"; 
e1.count = 3; 
Add(items, e5); 

public void Add(List<myItems> list, myItems newItem) 
{ 
    var item = list.SingleOrDefault(x => x.symbol == newItem.symbol); 

    if(item != null) 
    { 
     item.count += newItem.count; 
    } 
    else 
    { 
     list.Add(newItem); 
    } 
} 
-1

これが含まれているかどうかを確認すると、インデックスを取得してその番号を追加するよりも実際に戻ります。その論理を使用してください。それが動作します。あなたが欲しいものを知っているときに、辞書がはるかに高速検索を提供するので

+0

バッグと呼ばれる。これは、デフォルトのC#の平等性チェックがちょうど参照の等価をチェックすることでコアの問題に取得していない参照

// Assuming you want to add a new 'pencil' with a count of 3 int oldCount = 0; items.TryGetValue("pencil", out oldCount); items["pencil"] = oldCount + 3; 

のようなことを行うことができるだろう、価値の平等ではない。 –

+0

@amitpatelはい、それは私が試していたものでしたが、シンボルとカウントが同じである場合にのみtrueを返します:鉛筆4、鉛筆4、真を返しますが、鉛筆4、鉛筆3、一致しない – Beef

0

言われてそのカスタムEquals方法

public override bool Equals(object o) 
{ 
    MyItems mi = o as MyItems; 
    if (mi == null) 
     return false; 
    if (itemName == null) 
     return mi.itemName == null; 
    return itemName.Equals(mi.itemName); 
} 

public override int HashCode() 
{ 
    return (itemName ?? string.Empty).HashCode(); 
} 

を書き、確かに、あなたは本当に、代わりに辞書/ハッシュテーブルを使用する必要があります。 Listの実装では、リストにMyItemを追加するたびにリスト全体が検索されます。

1

辞書は、この問題のためによく適しているかもしれません:

readonly Dictionary<string, int> _dict = new Dictionary<string, int>(); 

void InsertOrUpdate(string name, int count) 
{ 
    int previousCount = 0; 

    // item already in dictionary? 
    if (_dict.TryGetValue(name, out previousCount)) 
    { 
     // add to count 
     count += previousCount; 
    } 

    _dict[name] = count; 
} 

void Main() 
{ 
    InsertOrUpdate("pencil", 3); 
    InsertOrUpdate("eraser", 3); 
    InsertOrUpdate("pencil", 4); 

    // print them 
    foreach (var item in _dict) 
     Console.WriteLine(item.Key + " " + item.Value); 
} 
1

あなたのクラスにEqualsメソッドを追加することができ、またはあなたがやっているすべてはあなたヘクタールどのように多くの「アイテム」を追跡されている場合、しかし、

items.Where(i => i.itemName == "pencil") 

ようなものでLINQを使用しますあなたの問題をより簡単に解決するためにitemNamesを数えられるようにマップするディクショナリですか?そして、あなたは通常、このようなものが

関連する問題