-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";

什么是idea数据结构?如果键或值的数量可以改变?我大概可以在哪里输入 DataStructure.Add(Mary, "New String); 或 DataStructure.AddWithNewKey("Timmy", List)?


有没有比为每个人保留一个列表或字符串数​​组更好的方法?


在下面的评论中,我很困惑为什么数据在编译时已知或纯粹是动态的会很重要。Jon 指出,如果要动态构建数据,理想的做法是使用字典,将字符串值与人员相关联。否则他的 linq 解决方案非常好。

4

1 回答 1

2

听起来你想要一个ILookup- 从键到多个值的映射。您可以使用ToLookupLINQ 中的方法创建它。或者,如果您想以可变的方式构建类似的东西,您可以使用 a Dictionary<,>,其中的类型是某种类型的列表,例如Dictionary<string, IList<string>>。这比使用查找要复杂一些,并且对于缺少键的行为也没有那么优雅。

请注意,最好的解决方案部分取决于您如何获取数据。从您的示例中并不清楚。

编辑:你不会想要一个Lookup<bool, StringInfo>. 你会想要一个Lookup<Person, string>wherePersonTom,MaryJohn类似的枚举。这些被硬编码为属性的事实很尴尬,但并非不可克服。我会添加一个这样的实用方法:

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 回答