11

約 9000 個の製品のリストがあり、その中には重複している可能性があるものもあります。

重複を簡単に見つけられるように、製品のシリアル番号をキーとしてこれらの製品の HashTable を作成したかったのです。

C#/.NET で HashTable を使用するにはどうすればよいでしょうか? HashSet の方が適切でしょうか?

最終的には、次のようなリストが必要です。

キー シリアル: 11110 - 内容: Product1
キー シリアル: 11111 - 内容: Product3、Product6、Product7
キー シリアル: 11112 - 内容: Product4
キー シリアル: 11113 - 内容: Product8、Product9

そのため、すべての製品のリストがあり、それらはシリアル番号が重複している製品ごとにグループ化されています。これを行う「正しい」方法は何ですか?

4

6 に答える 6

13

Dictionary は、このようなものに推奨されるクラスだと思います。

あなたの場合はこのようなものになります

Dictionary<string, List<Product>>

(シリアル文字列をキーとして使用)

于 2010-01-03T19:00:35.877 に答える
7

ハッシュテーブルは一種の辞書であり、ハッシュセットは一種のセットです。辞書もセットも問題を直接解決しません。1 つのキーに対して複数のオブジェクトを保持するデータ構造が必要です。

このようなデータベースは、マルチマップと呼ばれることがよくあります。キーのタイプが整数で、値のタイプが何らかの種類のセット (たとえば、ハッシュセット...) であるハッシュテーブルを使用するだけで作成できます。

または、次のような既存のマルチマップ ソリューションを参照することもできます: multimap in .NET

ハッシュテーブルの使用については、MSDN で確認できます: http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx 。他にもたくさんのチュートリアルがあります。いずれかを使用して検索してください。 「ハッシュテーブル」または「辞書」。

于 2010-01-03T19:05:55.197 に答える
6

一般的な Dictionary がこれに最適だと思います。コードは次のようになります。

var keyedProducts = new Dictionary<int,List<string>>();

foreach (var keyProductPair in keyProductPairs)
{
  if (keyedProducts.Contains(keyProductPair.Key))
    keyedProducts[keyProductPair.Key].Add(keyProductPair.Product);
  else
    keyedProducts.Add(keyProductPair.Key, new List<string>(new[]{keyProductPair.Product}));
}
于 2010-01-03T19:05:25.753 に答える
2

.NET で利用できるようになった優れたオプションは、Lookupクラスです。MSDN ドキュメントから:

Lookup(Of TKey, TElement) は Dictionary(Of TKey, TValue) に似ています。違いは、Dictionary(Of TKey, TValue) はキーを単一の値にマップするのに対し、Lookup(Of TKey, TElement) はキーを値のコレクションにマップすることです。

Lookup と Dictionary(Of List) にはいくつかの違いがあります。つまり、ルックアップは不変です (作成後に要素やキーを追加または削除することはできません)。データの使用方法によっては、 Lookup がGroupBy() よりも有利な場合があります。

于 2014-06-10T14:59:16.230 に答える
1

最初に、各オブジェクトに固有の一連のフィールドである「主キー」を定義する必要があります。そのセットの一部になると思いKey-Serialますが、他にもあるはずです。その「主キー」を定義したら、を表す構造体を定義し、それKey Valueを製品を含むディクショナリのキーとして使用できます。

例:

struct ProductPrimaryKey
{
    public string KeySerial;
    public string OtherDiscriminator;

    public ProductPrimaryKey(string keySerial, string otherDiscriminator)
    {
        KeySerial = keySerial;
        OtherDiscriminator = otherDiscriminator;
    }
}

class Product
{
    public string KeySerial { get; set; }
    public string OtherDiscriminator { get; set; }
    public int MoreData { get; set; }
}

class DataLayer
{
    public Dictionary<ProductPrimaryKey, Product> DataSet 
        = new Dictionary<ProductPrimaryKey, Product>();

    public Product GetProduct(string keySerial, string otherDiscriminator)
    {
        return DataSet[new ProductPrimaryKey(keySerial, otherDiscriminator)];
    }
}
于 2010-01-03T19:00:33.180 に答える
0

単純に重複のリストが必要な場合は、次のことができます。

  • テーブルエントリを作成します(それをDictionary<T>呼び出しましょうIEnumerable<T>(重複キーは無視されます)

  • Hashset<T>同じのを作成しますIEnumerable<T>(行全体が同じでない限り、重複キーを保持します)

  • を反復処理し、各値dictionary.Valuesを呼び出しますhashset.Remove(value)

に残っているのhashsetは重複です。

于 2012-12-12T15:18:45.957 に答える