7

テーブルを走査している間、おそらく一意であると思われるアイテム ID をキーとして、ファイルの場所を値としてハッシュ テーブルに格納しています。実行中に、キーと場所のペアが一意であることを確認するか、エラー メッセージをスローする必要があります。ハッシュテーブルを設定して値を読み込んでいますが、何をテストすればよいかわかりません:

Hashtable check_for_duplicates = new HashTable();
foreach (object item in items)
{
    if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
        //what goes here?  Would be contains item["Path"] as the value for the key)
    {
        //throw error
    }
}
4

8 に答える 8

11

これを試して:

Hashtable check_for_duplicates = new HashTable();
foreach (object item in items)
{
    if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
        check_for_duplicates[item["ItemID"]].Equals(item["Path"]))
    {
        //throw error
    }
}

また、.NET 2.0 以降を使用している場合は、次のように Generics を使用することを検討してください。

List<Item> items; // Filled somewhere else

// Filters out duplicates, but won't throw an error like you want.
HashSet<Item> dupeCheck = new HashSet<Item>(items); 

items = dupeCheck.ToList();

実は今確認したところ、HashSetは.NET 3.5のみのようです。Dictionary は 2.0 に適しています。

Dictionary<int, string> dupeCheck = new Dictionary<int, string>();

foreach(Item item in items) {
    if(dupeCheck.ContainsKey(item.ItemID) && 
       dupeCheck[item.ItemID].Equals(item.Path)) {
        // throw error
    }
    else {
        dupeCheck[item.ItemID] = item.Path;
    }    
}
于 2009-03-19T17:30:08.743 に答える
4

Dictionary代わりに使用していた場合は、TryGetValueメソッドが役立ちます。かなり廃止されたHashtableクラスにとって本当に良い方法があるとは思いません。

object value;
if (dic.TryGetValue("key", out value) && value == thisValue)
  // found duplicate
于 2009-03-19T17:29:06.297 に答える
3
if (check_for_duplicates.ContainsKey(item["ItemID"]) &&
    check_for_duplicates[item["ItemID"]] == item["Path"])
{
    //throw error
}
于 2009-03-19T17:29:46.827 に答える
3

ContainsKey が最良の方法です。

.NET 1.1 の使用を強制されない場合は、.NET 2.0 で導入された Dictionary を使用します。

パフォーマンスの面では Hashtable よりもはるかに優れており、厳密に型指定されています。

Dictionary<string, int> betterThanAHash = new Dictionary<string, int>();

betterThanAHash.ContainsKey("MyKey");
于 2009-03-19T17:32:12.360 に答える
2

Dictionary代わりに使ってみませんか?

Addにすでに存在するキーを試行すると、ArgumentExceptionがスローされDictionaryます。

check_for_duplicatesそうすれば、後でテストを実行するのではなく、追加された瞬間に複製をキャッチできます。

于 2009-03-19T18:23:56.103 に答える
2
Hashtable check_for_duplicates = new HashTable();

foreach (object item in items) 
{
    if (check_for_duplicates.ContainsKey(item["ItemID"]) && check_for_duplicates[item["ItemID"]] == item["Path"])
    {
        //throw error
    } 
}

私はこれがあなたが探しているものだと信じています。

編集 - 私はパンチに殴られたように見えます:P

于 2009-03-19T17:34:56.953 に答える
1

使用しているもののバージョンは言わなかった。HashtableとHashSetを使用しなければならない理由はありますか?データ構造で重複が許可されていない場合は、重複をチェックする必要はありません。参照:

http://www.vcskicks.com/csharp_data_structures2.html

それ以外に、Hashtableで同じことをどのように達成するかという質問はすでにここで回答されています。そもそも病理学的検査を禁止していれば、病理学的検査をすべて行う必要はないということを指摘しておきます。

于 2009-04-17T17:51:19.527 に答える