泛型类中的Getter
本文关键字:Getter 泛型类 | 更新日期: 2023-09-27 18:10:56
我有一个泛型类,它看起来像这样:
// K is key, T is type of content
class myClass<K, T>
{
private List<T> items;
private Dictionary<K, T> itemMap;
}
getter by key:
public T get(K index)
{
if (this.itemMap.ContainsKey(index))
{
return this.itemMap[index];
}
else
{
// no key found
return default(T);
}
}
当我使用这个简单的类作为T(使用id作为itemMap中的键):
class myConcreteT
{
int id;
int otherParameter;
}
通过otherParameter在items List中查找该类实例的正确方法是什么?任何帮助都将不胜感激。
在list/dictionary中查找项目的方法如下:
myConcreteT search = ...
var item = items.Where(x => x.otherParameter == search.otherParameter)
.FirstOrDefault();
如果你想要"通用"版本,你可以将谓词与值一起传递给搜索函数:
T SearchByItem(T search, Func<T, T, bool> matches)
{
return items.Where(x => matches(x,search))
.FirstOrDefault();
}
如果您希望泛型类型T具有已知属性,那么您必须在泛型类定义中添加约束。如果这是不可能的,那么比较算法将不得不由呼叫者提供,如@Alexei Levenkov的回答
public interface IKnownProperties
{
int id {get;}
int otherParameter { get; }
}
// K is key, T is type of content
class myClass<K, T> where T:IKnownProperties
{
private List<T> items;
private Dictionary<K, T> itemMap;
}
class myConcreteT : IKnownProperties
{
int id {get;set;}
int otherParameter {get;set;}
}