C#中Dictionaries的替代方法是什么,允许重复键?

Ada*_*331 31 c# collections dictionary

我有一个方法可以返回曾参与某些项目的技术人员组,例如:

project 1 | John
project 1 | Tim
project 2 | John
project 2 | Dave
Run Code Online (Sandbox Code Playgroud)

我最初尝试创建一个字典,这通常是我的键值对的集合,但在这种情况下我无法使用它,因为我不能有一个重复的键(项目).我可以使用哪种替代方案?

我唯一的想法是创造一个Dictionary<Project, List<Technicians>>但是有更容易的东西吗?

Tig*_*ran 44

在您的情况下,相同的键与多个值相关,因此标准字典不适合.你可以声明它Dictionary<Key, List<Values>>.

但是,你也可以使用:

Lookup类,是

表示每个映射到一个或多个值的键集合.

为此,您需要3.5及更多的框架.

  • @Dennis:我怀疑OP会发现这个有用.`Lookup`是一个只读集合,只能使用现有数据中的LINQ创建.你不能自己实例化,也不能改变它. (13认同)
  • 更改`Project`类_is_是首选,因为您显然需要一个链接到技术人员列表的项目.如果您不能更改Project类的源代码,我可以看到使用Lookup类或Dictionary,但是如果可以的话,在两个类之间创建__clear连接是有用的. (6认同)

Gre*_*rdt 13

您需要的是一个Project和一个或多个技术人员之间的关系:

public class Project
{
    public ICollection<Technician> Technicians { get; set; }
}

var project = new Project();
project.Technicians = new List<Technician>()
{
    new Technician(),
    new Technician()
};
Run Code Online (Sandbox Code Playgroud)

你的物体应该反映现实生活中的关系.

作为旁注,您可能有兴趣阅读有关域驱动设计的内容.

public void LoadTechnicians(Project project)
{
    List<Technician> techs = new List<Technician>();

    // query the database and map Technician objects

    // Set the "Technicians" property
    project.Technicians = techs;
}
Run Code Online (Sandbox Code Playgroud)


svi*_*ick 12

从MS实验NuGet包包含MultiValueDictionary.

基本上,它就像是Dictionary<Project, List<Technicians>>,除了你List每次访问它时都不必重复所有逻辑来管理它.

  • 只是一个注释,但它不再是MultiDictionary.它已被重命名为MultiValueDictionary以更好地说明它的作用:http://blogs.msdn.com/b/dotnet/archive/2014/08/05/multidictionary-becomes-multivaluedictionary.aspx (2认同)

Pio*_*ski 5

我认为您的解决方案没有任何问题。毕竟,您可以按项目轻松访问所有团队成员。但是,您也可以尝试List<KeyValuePair<Project, Technician>>. 您保持键值关系,但不受不重复键的限制。比你现在拥有的要简单得多吗?取决于用例。

或者,您可以将此结构隐藏在自定义集合实现之后。