正在根据列表定义自定义集合 class。如何访问存储在实例中的元素?
Defining custom collection class based on list. How to access elements that are stored in the instance?
正在创建从 List 继承方法的自定义数据集合 class。这种新类型将项目保存在队列中,具有包含所有项目和相应 ID 的私有字典,当添加新项目时检查队列中是否已经存在具有相同 ID 的项目并替换它。想知道有没有办法访问该元素(具有相同的 ID)并覆盖它。
我已经实现了一种方法,当有两个项目具有相同的 ID 时,代码会在队列中找到该项目的索引,将其删除,插入新项目并更新字典。它完美地工作,但我想知道是否有一种方法可以使此操作更有效,并且认为覆盖比删除和插入更容易。
public void Enqueue(T item, string uniqueID)
{
if (entries.ContainsKey(uniqueID))
{
int index = base.IndexOf(entries[uniqueID]);
base.Remove(entries[uniqueID]);
base.Insert(index, item);
entries[uniqueID] = item;
}
else
{
base.Add(item);
entries.Add(uniqueID, item);
}
}
entries
是包含字符串和 T
的字典
整个class定义
using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
/// <summary>
/// Queue based on class that has only one entry with unique ID
/// </summary>
/// /// /// <remarks>
/// When adding value with same ID old value is overwriten but place in the queue is maintained
/// </remarks>
/// <typeparam name="T"></typeparam>
public class ListQueueSet<T>:List<T>
{
new public void Add(T item) { throw new NotSupportedException(); }
new public void AddRange(IEnumerable<T> collection) { throw new NotSupportedException(); }
new public void Insert(int index, T item) { throw new NotSupportedException(); }
new public void InsertRange(int index, IEnumerable<T> collection) { throw new NotSupportedException(); }
new public void Reverse() { throw new NotSupportedException(); }
new public void Reverse(int index, int count) { throw new NotSupportedException(); }
new public void Sort() { throw new NotSupportedException(); }
new public void Sort(Comparison<T> comparison) { throw new NotSupportedException(); }
new public void Sort(IComparer<T> comparer) { throw new NotSupportedException(); }
new public void Sort(int index, int count, IComparer<T> comparer) { throw new NotSupportedException(); }
new public void Remove(T item) { throw new NotSupportedException(); }
private Dictionary<string, T> entries;
public ListQueueSet()
{
entries = new Dictionary<string, T>();
}
public void Enqueue(T item, string uniqueID)
{
if (entries.ContainsKey(uniqueID))
{
int index = base.IndexOf(entries[uniqueID]);
base.Remove(entries[uniqueID]);
base.Insert(index, item);
entries[uniqueID] = item;
}
else
{
base.Add(item);
entries.Add(uniqueID, item);
}
}
public T Dequeue()
{
var t = base[0];
base.RemoveAt(0);
entries.Remove(entries.FirstOrDefault(x => x.Value.Equals(t)).Key);
return t;
}
public T Peek()
{
return base[0];
}
}
int index = base.IndexOf(entries[uniqueID]);
this[index] = item;
entries[uniqueID] = item;
显然,this[index]
允许您访问您声明的列表内部
如评论中所述,您不应该从 List 继承并公开所有您不需要的功能。对于任何使用您的数据结构的人来说,这只会让人感到困惑。此外,使用 OrderedDictionary
将使您的代码更简单,因为它可以通过键和索引访问。
public class MyQueue<T>
{
private OrderedDictionary items = new OrderedDictionary();
public void Enqueue(T item, string uniqueID)
{
if(items.Contains(uniqueID))
items[uniqueID] = item;
else
items.Add(uniqueID, item);
}
public T Dequeue()
{
var item = items[0];
items.RemoveAt(0);
return (T)item;
}
public T Peek()
{
return (T)items[0];
}
}
此外,您可以通过强制转换为基类型轻松规避使用 List 函数的努力。
var queue = new ListQueueSet<int>();
((List<int>)queue).Add(1); //This will add 1 to the collection
正在创建从 List 继承方法的自定义数据集合 class。这种新类型将项目保存在队列中,具有包含所有项目和相应 ID 的私有字典,当添加新项目时检查队列中是否已经存在具有相同 ID 的项目并替换它。想知道有没有办法访问该元素(具有相同的 ID)并覆盖它。
我已经实现了一种方法,当有两个项目具有相同的 ID 时,代码会在队列中找到该项目的索引,将其删除,插入新项目并更新字典。它完美地工作,但我想知道是否有一种方法可以使此操作更有效,并且认为覆盖比删除和插入更容易。
public void Enqueue(T item, string uniqueID)
{
if (entries.ContainsKey(uniqueID))
{
int index = base.IndexOf(entries[uniqueID]);
base.Remove(entries[uniqueID]);
base.Insert(index, item);
entries[uniqueID] = item;
}
else
{
base.Add(item);
entries.Add(uniqueID, item);
}
}
entries
是包含字符串和 T
整个class定义
using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
/// <summary>
/// Queue based on class that has only one entry with unique ID
/// </summary>
/// /// /// <remarks>
/// When adding value with same ID old value is overwriten but place in the queue is maintained
/// </remarks>
/// <typeparam name="T"></typeparam>
public class ListQueueSet<T>:List<T>
{
new public void Add(T item) { throw new NotSupportedException(); }
new public void AddRange(IEnumerable<T> collection) { throw new NotSupportedException(); }
new public void Insert(int index, T item) { throw new NotSupportedException(); }
new public void InsertRange(int index, IEnumerable<T> collection) { throw new NotSupportedException(); }
new public void Reverse() { throw new NotSupportedException(); }
new public void Reverse(int index, int count) { throw new NotSupportedException(); }
new public void Sort() { throw new NotSupportedException(); }
new public void Sort(Comparison<T> comparison) { throw new NotSupportedException(); }
new public void Sort(IComparer<T> comparer) { throw new NotSupportedException(); }
new public void Sort(int index, int count, IComparer<T> comparer) { throw new NotSupportedException(); }
new public void Remove(T item) { throw new NotSupportedException(); }
private Dictionary<string, T> entries;
public ListQueueSet()
{
entries = new Dictionary<string, T>();
}
public void Enqueue(T item, string uniqueID)
{
if (entries.ContainsKey(uniqueID))
{
int index = base.IndexOf(entries[uniqueID]);
base.Remove(entries[uniqueID]);
base.Insert(index, item);
entries[uniqueID] = item;
}
else
{
base.Add(item);
entries.Add(uniqueID, item);
}
}
public T Dequeue()
{
var t = base[0];
base.RemoveAt(0);
entries.Remove(entries.FirstOrDefault(x => x.Value.Equals(t)).Key);
return t;
}
public T Peek()
{
return base[0];
}
}
int index = base.IndexOf(entries[uniqueID]);
this[index] = item;
entries[uniqueID] = item;
显然,this[index]
允许您访问您声明的列表内部
如评论中所述,您不应该从 List 继承并公开所有您不需要的功能。对于任何使用您的数据结构的人来说,这只会让人感到困惑。此外,使用 OrderedDictionary
将使您的代码更简单,因为它可以通过键和索引访问。
public class MyQueue<T>
{
private OrderedDictionary items = new OrderedDictionary();
public void Enqueue(T item, string uniqueID)
{
if(items.Contains(uniqueID))
items[uniqueID] = item;
else
items.Add(uniqueID, item);
}
public T Dequeue()
{
var item = items[0];
items.RemoveAt(0);
return (T)item;
}
public T Peek()
{
return (T)items[0];
}
}
此外,您可以通过强制转换为基类型轻松规避使用 List 函数的努力。
var queue = new ListQueueSet<int>();
((List<int>)queue).Add(1); //This will add 1 to the collection