"More functional" "accessor" 对于 C# 中的集合
"More functional" "accessor" for collections in C#
现在我有一个合集:Dictionary<string, List<string>> dictionary
。
出于某种原因,现在我想 "project/map" 它的一部分到其他集合,有点像将它用作支持字段,并为此集合创建不同的访问器。
比如List<string> keys
对应本字典的键,或者Dictionary<string, string> firstItems
对应一个字典,使用源字典的键作为键,源字典中值的第一项作为值。
这可以通过在 keys
和 firstItems
的 getter/setter 中添加行为来部分完成。当我们调用 keys
时,我们从 dictionary
获取密钥;或者当我们调用 keys = whateverTheListIs
时,dictionary
也可能会按照设计执行某些行为。
但是我也想有一个"more functional""accessor",比如我们调用firstItems.Add(aString, anotherString)
的时候,我们也给dictionary
加了一个入口;或者当我们调用 keys.Remove(yetAnotherString)
时,我们删除 dictionary
中的条目。
他们有办法让我做到吗?
编辑:
场景如下(当然你可以改,只是为了说明):
public class Projection
{
private Dictionary<string, List<string>> dictionary; //"backing field"
public List<string> keys;
public Dictionary<string, string> firstItems;
}
public static void DoSomething()
{
Projection projection = new Projection();
//Supposed to modify projection.dictionary too
projection.keys = new List<string>();
projection.keys.Add("A new Key");
}
您可以通过继承创建自己的 Dictionary
:
class CustomDictionary<TKey,TValue> : IDictionary<TKey, TValue>
{
// Implement the interface IDictionary here
public void Add(KeyValuePair<TKey, TValue> item)
{
// create your logic
}
}
你可以使用组合:
class CustomDictionary<TKey,TValue>
{
private Dictionary<TKey,TValue> _dictionary;
public void Add(KeyValuePair<TKey, TValue> item)
{
// create your logic
_dictionary.Add();
}
}
我最喜欢的方式,你可以同时使用:
class CustomDictionary<TKey,TValue> : IDictionary<TKey,TValue>
{
private Dictionary<TKey,TValue> _dictionary;
// Implement the interface IDictionary here
// send the logic to your private Dictionary
public void Add(KeyValuePair<TKey, TValue> item)
{
// create your logic
_dictionary.Add(item.Key, item.Value);
}
}
如果想直接继承Dictionary
,就会遇到问题。您不能覆盖 Add()
方法,因为它不是 virtual
方法。一种解决方案是使用关键字 new
.
隐藏它
class CustomDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
public new void Add(TKey key, TValue value)
{
// create your logic
base.Add(key, value);
}
public void Add(KeyValuePair<TKey, TValue> item)
{
this.Add(item.Key, item.Value);
}
}
现在我有一个合集:Dictionary<string, List<string>> dictionary
。
出于某种原因,现在我想 "project/map" 它的一部分到其他集合,有点像将它用作支持字段,并为此集合创建不同的访问器。
比如List<string> keys
对应本字典的键,或者Dictionary<string, string> firstItems
对应一个字典,使用源字典的键作为键,源字典中值的第一项作为值。
这可以通过在 keys
和 firstItems
的 getter/setter 中添加行为来部分完成。当我们调用 keys
时,我们从 dictionary
获取密钥;或者当我们调用 keys = whateverTheListIs
时,dictionary
也可能会按照设计执行某些行为。
但是我也想有一个"more functional""accessor",比如我们调用firstItems.Add(aString, anotherString)
的时候,我们也给dictionary
加了一个入口;或者当我们调用 keys.Remove(yetAnotherString)
时,我们删除 dictionary
中的条目。
他们有办法让我做到吗?
编辑:
场景如下(当然你可以改,只是为了说明):
public class Projection
{
private Dictionary<string, List<string>> dictionary; //"backing field"
public List<string> keys;
public Dictionary<string, string> firstItems;
}
public static void DoSomething()
{
Projection projection = new Projection();
//Supposed to modify projection.dictionary too
projection.keys = new List<string>();
projection.keys.Add("A new Key");
}
您可以通过继承创建自己的 Dictionary
:
class CustomDictionary<TKey,TValue> : IDictionary<TKey, TValue>
{
// Implement the interface IDictionary here
public void Add(KeyValuePair<TKey, TValue> item)
{
// create your logic
}
}
你可以使用组合:
class CustomDictionary<TKey,TValue>
{
private Dictionary<TKey,TValue> _dictionary;
public void Add(KeyValuePair<TKey, TValue> item)
{
// create your logic
_dictionary.Add();
}
}
我最喜欢的方式,你可以同时使用:
class CustomDictionary<TKey,TValue> : IDictionary<TKey,TValue>
{
private Dictionary<TKey,TValue> _dictionary;
// Implement the interface IDictionary here
// send the logic to your private Dictionary
public void Add(KeyValuePair<TKey, TValue> item)
{
// create your logic
_dictionary.Add(item.Key, item.Value);
}
}
如果想直接继承Dictionary
,就会遇到问题。您不能覆盖 Add()
方法,因为它不是 virtual
方法。一种解决方案是使用关键字 new
.
class CustomDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
public new void Add(TKey key, TValue value)
{
// create your logic
base.Add(key, value);
}
public void Add(KeyValuePair<TKey, TValue> item)
{
this.Add(item.Key, item.Value);
}
}