在这种情况下最适合使用的集合是什么?

时间:2018-03-07 21:10:21

标签: c# .net collections

基于最新版本的.NET / C#,最适合此方案的集合是什么?我需要返回具有用户ID的组ID的映射。因此,请考虑类似下面示例的映射,其中组111具有2个用户222和444:

111 222
111 444
555 222

KeyValuePair不是数据反映多对多关系的最有效的b / c。

3 个答案:

答案 0 :(得分:3)

您想要的数据结构称为“multimap”,“multidictionary”或“multivaluedictionary”,具体取决于您询问的对象。

有很多这样的实现;做一个网络搜索,你会发现一些。例如:

https://blogs.msdn.microsoft.com/dotnet/2014/08/05/multidictionary-becomes-multivaluedictionary/

https://www.dotnetperls.com/multimap

等等。

答案 1 :(得分:0)

遗憾的是LookUp课程并不完全公开,但您可以使用Linq创建它:

public class GroupUserid {
    public int group;
    public int userid;
}

var rawdata = List<GroupUserid>();
var groupMembership = rawdata.ToLookup(d => d.group, d => d.userid);

然后您可以使用以下命令查找组的成员:

var membersIn111 = groupMembership[111];

答案 2 :(得分:0)

如果你想知道的是群组中的用户以及特定用户是否最有效地在某个特定群组中(即可能是数千名用户),但是你不需要那么高效率确定单个用户所在的组,您也可以考虑使用

Dictionary<int, HashSet<int>> users = new Dictionary<int, HashSet<int>>();

// Adding a new group:
users[newGroup] = new HashSet<int>();

// Adding a new user to the group:
users[newGroup].Add(newUser);

// Then to find all users in a group:
HashSet<int> usersInAGroup = users[aGroup];

// If you want to know very fast if a specific user is in this group, then:
if (usersInAGroup.Contains(aUser)) {/* yes, the given user is in this group */};

HashSet特别针对很多元素的Contains()操作进行了优化。