为什么没有 KeyValuePair<> 实现的接口 IKeyValuePair<>?[关闭]

Why is there no interface IKeyValuePair<> which is implemented by KeyValuePair<>? [closed]

提问人:draz 提问时间:11/17/2023 更新时间:11/17/2023 访问量:44

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

2天前关闭。

我有一个可以实现 IKeyValuePair<> 接口的类,因此处理函数也可以在其他 KeyValuePairs 上运行,所以我想知道为什么没有 KeyValuePair 的接口<>它抽象出来。 有什么缺点吗?

interface IKeyValuePair<K, V>
{
    public K Key   { get; }
    public V Value { get; }
}


class MyClass : IKeyValuePair<DateTime, double>
{
    public DateTime Key   { get; }
    public double   Value { get; }
}

void MyFunction(IEnumerable<IKeyValuePair<DateTime,double>> data)
{
   // let's do something smart!
}

void Main()
{
    MyFunction(new List<MyClass>());
    MyFunction(new Dictionary<DateTime, double>());
}

当然,可以使用 Linq 进行转换:

void MyFunction2(IEnumerable<KeyValuePair<DateTime,double>> data)
{
   // let's do something smart!
}

void Main()
{
   var list = new List<MyClass>();
   var kvps = list.Select(x => new KeyValuePair<DateTime, double>(x.Key, x.Value) );
   MyFunction2( kvps );
}

但它看起来像一个很大的开销......

C# 泛型

评论

0赞 shingo 11/17/2023
因为现在有 ValueTuple: .(DateTime key, double value)
1赞 gunr2171 11/17/2023
与具体类型相比,您期望使用该接口有什么好处?
0赞 draz 11/17/2023
@shingo:您说 Dictionary<DateTime,double>正在实现 IEnumerable<(DateTimedouble)>?
0赞 draz 11/17/2023
@gum2171:如前所述,我不必转换来自 MYCLASS 的数据,这样无需重新实现函数即可获得更高的性能。
3赞 dbc 11/17/2023
另外,引用 Eric Lippert 的话:问题是“为什么 C# 没有这个功能?这个问题的答案总是一样的。默认情况下,功能未实现;C# 没有该功能,因为没有人设计、实现该功能并将其交付给客户。

答:

0赞 Xavier J 11/17/2023 #1

该类是密封的,因为它不应该只是一个键值对。Pair 表示 TWO,如在两个属性中 -- 和 。如果可以从该类继承并添加更多属性,则它将不再是一对。KeyValuePairKeyValue

这同样适用于您建议的接口。