有没有允许重复的 Dictionary/SortedList 的替代方案?

发布于 2024-07-13 21:03:10 字数 364 浏览 12 评论 0 原文

可能的重复:
允许重复键的 C# 可排序集合

基本上我想要使字典可以使用重复的键,而无需进入自定义比较器实现。 有一个想法:

  Dictionary<key, List<value>>

但它仍然有一些开销。 我希望字典有“AllowDuplicates”。

Possible Duplicate:
C# Sortable collection which allows duplicate keys

Basically I'd like to make a Dictionary work with duplicate keys without going into custom comparer implementations. There is an idea of:

  Dictionary<key, List<value>>

but it still has some overhead. I wish Dictionary had "AllowDuplicates".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

眼眸印温柔 2024-07-20 21:03:10

如果您使用的是 .NET 3.5,那么 Lookup 可能就是您的选择重新之后。

If you're using .NET 3.5 then Lookup is probably what you're after.

娇妻 2024-07-20 21:03:10

.NET 2.0:PowerCollections 包含 OrderedMultiDictionary.

.NET 2.0: PowerCollections contains the OrderedMultiDictionary.

那小子欠揍 2024-07-20 21:03:10

您仍然可以使用 SortedList 并尝试通过将您的值和 Guid 组合到一个类中来创建唯一键。 在这种情况下,您必须为新密钥实现 IComparer,如下所示:

class MyKey
{
    public Guid Guid { get; set; }
    public float Value { get; set; }
}

class MyComparer : IComparer<MyKey>
{

    public int Compare(MyKey x, MyKey y)
    {
        if (x == null || y == null)
            throw new InvalidOperationException("both of parameters must be not null");
        if (x.Value < y.Value) return -1;
        if (x.Value > y.Value) return 1;
        return 0;
    }
}

然后

var mySortedList = new SortedList<MyKey, MyValue>(new MyComparer());

You still can use SortedList and try to make a unique key by combining your value and a Guid into a class. In this case, you must implement the IComparer<NewKey> for your new key, something like:

class MyKey
{
    public Guid Guid { get; set; }
    public float Value { get; set; }
}

class MyComparer : IComparer<MyKey>
{

    public int Compare(MyKey x, MyKey y)
    {
        if (x == null || y == null)
            throw new InvalidOperationException("both of parameters must be not null");
        if (x.Value < y.Value) return -1;
        if (x.Value > y.Value) return 1;
        return 0;
    }
}

and then

var mySortedList = new SortedList<MyKey, MyValue>(new MyComparer());
墟烟 2024-07-20 21:03:10

不在 Fx < 中 3.5.. 显然,您可以使用 IList 对象的字典来实现一个。 但接下来你就会遇到封装问题/责任。

如果您使用的是 .NET 3.5,请使用 Lookup 类。

Not in the Fx < 3.5.. You can implement one, obviously, with a Dictionary of IList objects. But then you have the encapsulation issue/responsibility.

If you're using .NET 3.5, use the Lookup class.

笑叹一世浮沉 2024-07-20 21:03:10

那是行不通的。 一旦从比较器返回 0,它就会抛出“重复”异常。

您不需要类封装或任何东西,只需创建一个不返回 0(相等)结果的比较器即可。 这是 int 类型密钥的示例

class MyComparer : IComparer<int>
{

  public int Compare(int x, int y)
  {
    if (x < y)
      return -1;
    else return 1;
  }
}

That does not work. As soon as you return 0 from the comparer, it will throw "duplicate" exception.

You don't need classes encapsulation or anything, just make a comparer that does not return 0 (equal) result. Here is an example for int type of key

class MyComparer : IComparer<int>
{

  public int Compare(int x, int y)
  {
    if (x < y)
      return -1;
    else return 1;
  }
}
属性 2024-07-20 21:03:10

根据定义,字典包含唯一的键。 上面的示例实际上是一种二维键控数组,这是我多次使用的结构。 为什么你想要重复的钥匙? 如果您这样做,词典将如何独特地称呼其成员?

By definition, a Dictionary contains unique keys. Your example above is effectively a sort of two-dimensional keyed array, a structure I've used many times. Why would you want to have duplicate keys? If you did, how would the Dictionary uniquely address its members?

心在旅行 2024-07-20 21:03:10

我遇到了同样的问题..我需要一个可以允许重复键的sortedList..

var sortList = new SortedList<string, IDictionary<string, object>>();

但这不起作用..所以我使用

var list = new List<KeyValuePair<string, IDictionary<string, object>>>();

向其中添加新数据..

list.Add(new KeyValuePair<string, IDictionary<string, object>>>(value, Dictionary));

使用linq我对它进行排序没有问题..

尝试 List>>();

I came across with same issue.. I needed a sortedList which can allow Duplicate Keys..

var sortList = new SortedList<string, IDictionary<string, object>>();

but this didnt work.. so i used

var list = new List<KeyValuePair<string, IDictionary<string, object>>>();

add new data to it as ..

list.Add(new KeyValuePair<string, IDictionary<string, object>>>(value, Dictionary));

with linq i sorted it with no problem..

Try List<KeyValuePair<TKey, List<TValue>>>();

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文