-2

簡単な例:

Tom, Mary and John say "I want an apple"
Tom and John say "I want a race car"
John and Mary say "I want a pretty dress."

DataStructure[Tom] returns --> "I want an apple";"I want a racecar";
DataStructure[Mary] returns --> "I want an apple";"I want a pretty dress";

アイデアのデータ構造とは? キーまたは値の数を変更できる場合は? おそらくどこに DataStructure.Add(Mary, "New String); または DataStructure.AddWithNewKey("Timmy", List) と入力できますか?


人ごとに文字列のリストまたは配列を保持するよりも良い方法はありますか?


以下のコメントで、データがコンパイル時に既知であるか、純粋に動的であるかが問題になる理由について、私は混乱しました。Jon は、データが動的に構築される場合、文字列の値を人々に関連付ける辞書が理想的であると指摘しました。それ以外の場合、彼の linq ソリューションは非常に優れています。

4

1 に答える 1

2

ILookupキーから複数の値へのマップが必要なようです。ToLookupこれは、LINQのメソッドを使用して作成できます。あるいは、変更可能な方法で同様のものを構築したい場合は、Dictionary<,>の型がある種のリストである aを使用できます。これは、ルックアップを使用するよりも少し手間がかかり、欠落しているキーに対してエレガントに動作しません。Dictionary<string, IList<string>>

最善の解決策は、データの取得方法によって部分的に異なります。あなたの例からはあまり明確ではありません。

編集: . は必要ありませんLookup<bool, StringInfo>Lookup<Person, string>where Personwas enum TomMaryJohnまたは同様のものが必要です。これらがプロパティとしてハードコードされているという事実は厄介ですが、克服できないわけではありません。次のようなユーティリティ メソッドを追加します。

static IEnumerable<Person> GetPeople(StringInfo input)
{
    // I don't normally use this formatting, but it's cleaner than the
    // alternatives in this particular case.
    if (input.Mary) yield return Person.Mary;
    if (input.Tom) yield return Person.Tom;
    if (input.John) yield return Person.John;
}

その後、次を使用できます。

var lookup = allStringInfos
       .SelectMany(info => GetPeople(info),
                   (info, person) => new { text = info.stringInfo, person })
       .ToLookup(pair => pair.person,
                 pair => pair.text);

それで:

foreach (string value in lookup[Person.John])
{
    ...
}
于 2012-11-27T19:16:01.527 に答える