c#中如何实现可以重复的键值

key可以重复,value可以重复,但是(key,value)却惟一,就是不允许重复,key可以一对多,value也可以一对多,但是(key,value)惟一,如何实现?... key可以重复,value可以重复,但是(key,value)却惟一,就是不允许重复,key可以一对多,value也可以一对多,但是(key,value)惟一,如何实现?用sortedlist和dictionary类时都要求key惟一不重复,我该用什么实现?怎么实现?实现后不进行键值对的排序。

回答后还有50分
展开
 我来答
魔法软糖™
2020-02-19 · TA获得超过837个赞
知道小有建树答主
回答量:822
采纳率:94%
帮助的人:147万
展开全部

软糖二话不说直接上代码


按Key排序的 MutiSortedList<TKey, TValue>

 /// <summary>

    /// 按Key排序再按Value排序的SortedList,Key和Value都可以重复,但禁止键值对完全相同。

    /// </summary>

    public class MutiSortedList<TKey, TValue> : SortedList<TKey, TValue> where TKey : IComparable

    {

        /// <summary>

        /// 相等的键也返回不等

        /// </summary>

        private class MyComparer<TCKey> : IComparer<TCKey> where TCKey : IComparable

        {

            public int Compare(TCKey x, TCKey y)

            {              

                int i = x.CompareTo(y);

                // (-1) x在y之前   //  (1) x在y之后

                if (i == 0) { return (-1); } else { return i; }

            }

        }

        public MutiSortedList() : base(new MyComparer<TKey>()) { }

        public new void Add(TKey key, TValue value)

        {                    

            foreach (KeyValuePair<TKey, TValue> item in this)

            {       //检查是否具备这个key,并且检查value是否重复 

                if (item.Key.Equals(key) && item.Value.Equals(value)) { return; }

            }

            base.Add(key, value);

        }

        public new void Remove(TKey key)

        {

            for (int i = 0; i < this.Count; i++)

            {

                if (Keys[i].Equals(key)) { base.RemoveAt(i); }

            }

        }

        public void Remove(TValue value)

        {

            for (int i = 0; i < this.Count; i++)

            {

                if (Values[i].Equals(value)) { base.RemoveAt(i); }

            }

        }

        public void Remove(TKey key, TValue value)

        {

            for (int i = 0; i < this.Count; i++)

            {

                if (Keys[i].Equals(key) & Values[i].Equals(value)) { base.RemoveAt(i); }

            }

        }

        public new TValue this[TKey key]

        {

            get { return base[key]; }

        }

        /// <summary>

        /// 返回键对应的值列表

        /// </summary>

        /// <param name="key"></param>

        /// <param name="升序"></param>

        /// <returns>返回IList(Of 值)</returns>

        public IList<TValue> this[TKey key, bool 升序] 

        {

            get {

                var 结果 = new List<TValue>();

                for (int i = 0; i < Count; i++)

                {

                    if (Keys[i].Equals(key))

                    { 结果.Add(Values[i]); }

                }

                return 结果;

            }

        }

    }


不排序的,实际内部装的是Tuple,不使用Key和Value而用Item1和Item2

    /// <summary>

    /// 按默认顺序排序的Dictionary,Key和Value都可以重复,但禁止键值对完全相同。

    /// <para>继承于 <see cref="List{Tuple}"/><see cref="Tuple{TKey, TValue}"/></para>

    /// </summary>

    public class TupleList<TKey, TValue> : List<Tuple<TKey, TValue>> {

        public void Add(TKey key, TValue value) {

            foreach (var item in this) {       //检查是否具备这个key,并且检查value是否重复 

                if (item.Item1.Equals(key) && item.Item2.Equals(value)) { return; }

            }

            base.Add(new Tuple<TKey, TValue>(key, value));

        }

        public void Remove(TKey key) {

            foreach (var item in this) {      

                if (item.Item1.Equals(key)) { Remove(item); }

            }

        }

        /// <summary>

        /// 返回键对应的多个值组成的列表<see cref="IList{TValue}"/>

        /// </summary>

        /// <param name="key"></param>

        /// <param name="升序"></param>

        /// <returns>返回IList(Of 值)</returns>

        public IList<TValue> this[TKey key, bool 升序 = false] {

            get {

                var 结果 = new List<TValue>();

                foreach (var item in this) {       //检查是否具备这个key,并且检查value是否重复 

                    if (item.Item1.Equals(key)) { 结果.Add(item.Item2); }

                }

                return 结果;

            }

        }

    }


jnc911
推荐于2018-05-18 · TA获得超过192个赞
知道小有建树答主
回答量:160
采纳率:0%
帮助的人:0
展开全部
JAVA里有个IndentityHashMap可以实现重复key的集合
C# 里当然肯定必须也会有这样的类了 NameValueCollection

参考MSDN
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref2/html/T_System_Collections_Specialized_NameValueCollection.htm

当然1楼的也不失为一个好办法 而且还可以把keyValue(1楼中的类)放到一个list里 这样不用重写equals方法 也不用dictonary了 不过就是判断时候麻烦点
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
旁笑槐NH
2009-11-17 · TA获得超过2545个赞
知道大有可为答主
回答量:2686
采纳率:0%
帮助的人:2889万
展开全部
写一个新类KeyValue,有成员key和value,重写Equals方法,为return key.Eqauls(other.key)&&value.Equals(other.value);
把它作为dictonary的key就行了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式