问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-23 13:53

我来回答

3个回答

热心网友 时间:2023-10-16 18:07

软糖二话不说直接上代码


按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 结果;

            }

        }

    }


热心网友 时间:2023-10-16 18:07

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了 不过就是判断时候麻烦点

热心网友 时间:2023-10-16 18:08

写一个新类KeyValue,有成员key和value,重写Equals方法,为return key.Eqauls(other.key)&&value.Equals(other.value);
把它作为dictonary的key就行了

热心网友 时间:2023-10-16 18:07

软糖二话不说直接上代码


按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 结果;

            }

        }

    }


热心网友 时间:2023-10-16 18:07

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了 不过就是判断时候麻烦点

热心网友 时间:2023-10-16 18:08

写一个新类KeyValue,有成员key和value,重写Equals方法,为return key.Eqauls(other.key)&&value.Equals(other.value);
把它作为dictonary的key就行了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
导购什么字 店面导购员是什么意思 HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayer\SafeVersions... 无法安装adobeflashplayer,说无法注册ACTIVEX的控件 无法注册flash player的activex怎么办 omniverse create 他总说无法注册Flash player的Active控件 然后什么访问以下链接。不要... excel如何用进度条的形式表示完成率 买了件速干衣,北面的,求大神看一下真假。 秦皇岛银谷全城热恋是不是要预定票啊 合同生效后未实际履行的是否有效 吃橘子能减肥吗 相机上的ISO感光度该怎么设置呢? 什么是可重复读 双方未履行合同合同是否有效? 组合可重复的问题:n 个不同的元素,取m个,公式是什么? 请问数码相机的ISO怎么调? 合同生效未履行怎么处理 数字排列组合公式(可重复) 合同不履行是否有效 可重复利用的航天器有什么优点? 合同生效合同有效但未履行怎么办 我们的故事系列有没有处新的呀,还有专属秘密有没有txt版本的 为什么科学实验必须具有可重复性 双方在合同上签字,但一方没有履行,此合同是否有效? 咸鱼芝麻信用分怎么提高 能把元媛的小说合集发给我吗??谢谢了718786540@qq.com 可重复使用的电池是? 双方未履行合同合同有效吗? 闲鱼上的芝麻信用差是怎么造成的 减肥期间可以吃橘子吗 合同未履行怎么处理 桔子减肥吗 合同不实际履行有效吗 橘子可以减肥吃吗 合同在有效期内未履行怎么办 减肥能吃橘子吗 有效合同没有履行合同有效吗 吃橘子可以减肥吗? 合同生效后未履行会承担什么责任呢 橘子含有的热量很高吗?减肥期间能吃吗? 合同上的条款没履行完合同能生效吗 减肥期间可以吃桔子吗 没有履行合同义务的合同是否有效? 减肥的时候能吃橘子吗 吃橘子减肥么? 橘子含糖为什么可以减肥? 根鸟全文阅读 吃桔子能减肥吗 不会英语,如何自学英语?