2

次の形式で、テストファイルを解析しています。

[Person]: [Name]-[John Doe], [Age]-[113], [Favorite Color]-[Red].

[Person]: [Name]-[John Smith], [Age]-[123], [Favorite Color]-[Blue].

[Person]: [Name]-[John Sandles], [Age]-[133], [Favorite Color]-[Green].

[Person]: [Name]-[Joe Blogs], [Age]-[143], [Favorite Color]-[Khaki].

ご覧のとおり、値は重複していませんが (将来の重複を考慮したいのですが)、キーは重複しています。キーはハイフン (-) の前の部分です。

しかし、これらを辞書に入れるたびに、それは適合し、複製は許可されていないと教えてくれます。辞書が複製を許可しないのはなぜですか? そして、どうすればこれを克服できますか?

4

6 に答える 6

1

辞書には、高速検索のためにハッシュされたTKey部分があります。そこに重複があると、衝突や複雑さが発生し、すばやく効率的に検索する能力が低下します。そのため、複製は許可されていません。

Dictionnary<ID, MyStruct>データを含む構造体を作成し、それをたとえばに入れることができます。このようにして、キーの重複を回避します(これは構造体ごとに一意であり、すべてのデータがディクショナリにあります。

于 2012-09-06T08:05:51.483 に答える
1

ディクショナリは値に重複を含めることができますが、キーに重複を含めることはできません。これは、どのキーの値が必要かをどのように判断するかです。

そして、どうすればこれを克服できますか

を使用しますKeyvaluePair[]が、その場合でも、どのキーの値が必要かをどのように判断しますか?

于 2012-09-06T08:06:09.323 に答える
1

Wintellect Power Collections の MultiDictionary クラスを使用できます。Power Collections は、.Net 2 以降の長い歴史を持つコレクション クラスのセットです。5 年間更新されていませんが、更新する必要はありません。

ここを参照してください: http://powercollections.codeplex.com/

ここからダウンロードしてください: http://powercollections.codeplex.com/releases/view/6863

于 2012-09-06T08:32:09.550 に答える
0

あなたの質問に基づいて、あなたは[名前]、[年齢]、[お気に入りの色]をキーとして使用していると思います。これらのキーを使用してデータを辞書に入れる方法はたくさんありますが、本当の問題は、どのようにしてデータを取り戻すかということです。

辞書のキーは一意である必要があるため、キーとして使用するには、いくつかの一意のデータを見つける必要があります。あなたの場合、テストファイルは個人のリストのように見えます。各行には個人のデータが含まれています。したがって、最も自然な方法は、重複していない限り、「一意のデータ」が個人の名前である必要がある個人に関する行を含む辞書を作成することです。

ただし、実際には、人の名前は通常悪い選択です(時間の経過とともに変化する可能性があるだけでなく、同じ名前の可能性が非常に高いため)。そのため、代わりに人工キーが使用されます(行番号、GUIDなど)。

編集プロパティの数が異なる場合があることがわかります。したがって、ネストされた辞書を使用する必要があります。外側-「Persons」の場合は「Persons」、Personプロパティの場合は内側:

Dictionary<string, Dictionary<string, string>> person_property_value;

ただし、データ構造をより理解しやすくするには、Personクラス内に内部ディクショナリを配置する必要があります。

class Person{
    public readonly Dictionary<string, string> props;

    public Person()
    {
        props = new Dictionary<string, string>();
    }
}

次に、Personを次のように追加します。

Person p = new Person();
p.props['Name'] = 'John Doe';
p.props['Age'] = 'age';
dictionary.Add('John Doe', p);

そしてそれを次のように取り戻します:

Person p = dictionary[Name];

複数の人が同じ名前を共有できるようにするには、辞書を次のように宣言します。Dictionary<string, List<Person>>

于 2012-09-06T08:19:47.773 に答える
0

最も簡単なことは、 を使用することDictionary<string, List<string>>です。

使用法:

foreach(var person in persons)
{
    List<string> list;
    if(!dict.TryGetValue(person.Key, out list)
    {
        list = new List<string>();
        dict.Add(person.Key, list);
    }

    list.Add(person.Data);
}
于 2012-09-06T08:07:23.083 に答える
0

Lookup<TKey, TElement>名前空間のクラスは System.Linq、それぞれが 1 つ以上の値にマップされたキーのコレクションを表します。詳細: MSDN

List<Person> list= new List<Person>();
// ...
var lookup = list.ToLookup(person => person.Key, person => new {Age=person.Age, Color=person.Color});

IEnumerable<Person> peopleWithKeyX = lookup["X"];

public class Person
{
    public string Key { get; set; }
    public string Age { get; set; }
    public string Color { get; set; }
}
于 2012-09-06T08:11:17.990 に答える