我对c#集合相当陌生。我不知道如何解决这个问题。
一行代码
public class clsFeatureCollection : KeyedCollection<string, clsFeature>
给出错误
'clsFeatureCollection' does not implement inherited abstract member 'System.Collections.ObjectModel.KeyedCollection<string, clsFeature>.GetKeyForItem(clsFeature)'
这是我的代码。我不知道如何纠正这个问题,有人能帮忙吗?
public class clsFeature
{
private int m_OID { get; set; }
private IGeometry m_Geometry { get; set; }
}
public class clsFeatureCollection : KeyedCollection<string, clsFeature> // : IEnumerable
{
// ************************** Keyed Collection ****************
// https://msdn.microsoft.com/en-us/library/ms132438(v=vs.100)
public KeyedCollection<string, clsFeature> m_oCol; // KeyedCollection<string, clsFeature>();
public Dictionary<string, string> m_oColReverse;
public clsFeatureCollection() : base()
{
m_oCol = new clsFeatureCollection();
m_oColReverse = new Dictionary<string, string>();
}
public int GeyKeyForItem(clsFeature item)
{
return item.OID;
}
}
有三个主要问题:
- 和另一个答案一样,方法名 有拼写错误
-
KeyedCollection<TKey, TItem>.GetKeyForItem
应该返回类型为TKey
(docs) 的对象 - 构造函数中的
m_oCol = new clsFeatureCollection();
行递归调用构造函数。由于KeyedCollection
是抽象的,您不能直接实例化它。您需要使用base()
调用基构造函数。(见此答案或此答案)
感谢大家的投入和帮助
下面是我想出的最终工作解决方案。它与其他类似的集合集成。我最初使用一个列表,但我需要一个字符串作为其他集合的键
// ************************** Ordered Dictionary - works ****************
// http://stackoverflow.com/questions/2722767/c-sharp-order-preserving-data-structures
// http://www.go4expert.com/articles/understanding-c-sharp-dictionaries-t30034/
public OrderedDictionary m_oCol;
public OrderedDictionary m_oColReverse;
public clsFeatureCollection()
: base()
{
m_oCol = new OrderedDictionary();
m_oColReverse = new OrderedDictionary();
}
public IEnumerator GetEnumerator()
{
return m_oCol.GetEnumerator();
}
public void Add(IFeature pFeature, string strBefore = "", string strAfter = "", bool bReverse = false)
{
if (bReverse == true)
{
m_oColReverse.Add(pFeature.OID.ToString().Trim(), pFeature.OID.ToString().Trim());
}
if (!ContainsItem(pFeature.OID.ToString()))
{
m_oCol.Add(pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
}
}
public void AddBefore(IFeature pFeature, string strBefore, bool bReverse = false)
{
if (bReverse == true)
{
m_oColReverse.Add(pFeature.OID.ToString().Trim(), pFeature.OID.ToString().Trim());
}
if (!ContainsItem(pFeature.OID.ToString()))
{
if (strBefore != null)
{
int index = GetIndex(m_oCol, strBefore);
if (index > 0)
{
m_oCol.Insert(index - 1, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
}
else
{
m_oCol.Insert(0, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
}
}
}
}
public void AddAfter(IFeature pFeature, string strAfter, bool bReverse = false)
{
if (bReverse == true)
{
m_oColReverse.Add(pFeature.OID.ToString().Trim(), pFeature.OID.ToString().Trim());
}
if (!ContainsItem(pFeature.OID.ToString()))
{
if (!string.IsNullOrEmpty(strAfter))
{
int index = GetIndex(m_oCol, strAfter);
m_oCol.Insert(index + 1, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
}
else
{
m_oCol.Insert(0, pFeature.OID.ToString(), new clsFeature(pFeature.OID, pFeature.ShapeCopy));
}
}
}
public int Count
{
get { return m_oCol.Count; }
}
public void Remove(int Id)
{
m_oCol.RemoveAt(Id);
}
public clsFeature Item(int Position)
{
try
{
clsFeature value = (clsFeature)m_oCol.Cast<DictionaryEntry>().ElementAt(Position).Value;
return value;
}
catch (Exception)
{
throw;
}
}
public void Clear()
{
m_oCol = new OrderedDictionary();
m_oColReverse = new OrderedDictionary();
}
public bool Reverse(string valueRenamed)
{
bool bReverse = false;
try
{
if (m_oColReverse.Contains(valueRenamed))
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
if (ex is ArgumentException | ex is IndexOutOfRangeException)
{
bReverse = false;
}
}
return bReverse;
}
public bool ContainsItem(string oidValue)
{
bool bContainsItem = false;
string intOID = oidValue.ToString();
try
{
// dictionary
if (m_oCol.Contains(intOID))
{
bContainsItem = true;
}
else
{
bContainsItem = false;
}
return bContainsItem;
}
catch (Exception ex)
{
if (ex is ArgumentException | ex is IndexOutOfRangeException)
{
bContainsItem = false;
}
}
return bContainsItem;
}
public static int GetIndex(OrderedDictionary dictionary, string key)
{
for (int index = 0; index < dictionary.Count; index++)
{
if (dictionary[index] == dictionary[key])
{
return index;
}
}
return -1;
}
}
// ****************************** End Ordered Dictionary - works *****************************