gpt4 book ai didi

c# - 向 C# 列表索引器添加编译时安全性——这可能吗?

转载 作者:行者123 更新时间:2023-11-30 23:22:38 25 4
gpt4 key购买 nike

[注意:这个问题吸引了运行时性能低的解决方案,所以这里值得强调的是,除了类型安全之外,性能是关键。有关更多性能信息,请参阅末尾的注释。]

我正在使用 List<int> 的几个不同实例在相当复杂的算法中。

其中一些列表包含彼此之间的索引,即它们提供了一定程度的间接性。

我已经修复了一些由于访问列表时使用了错误的索引器而导致的错误。因为所有列表都是同一类型,即 List<int> ,编译器根本不提供任何类型安全。例如:

// The below statement is wrong - it should be list1[list2[x]], 
// as x is an index into list2, not list1.
// list2 returns indexes into list1.
// But the compiler is oblivious to this.
//
var f = list1[x];

因此,我开始考虑通过在每个只包含一个整数的列表中使用强类型索引来增加一定程度的类型安全性:

/// An index into the first list
struct Index1
{
public int Value { get; set; }
}

/// An index into the second list
struct Index2
{
public int Value { get; set; }
}

然后,声明正确索引类型的变量将在编译时捕获一类错误。 (这不是万无一失的,这不是我所追求的 - 更好就足够了。)

不幸的是一个通用的List<T>不提供使用自定义索引类型的方法 - 索引器始终是 int。

还有其他方法可以完成我想做的事情吗?我想到了一个定制系列——我不介意这种努力,它很可能会收回成本。但是我想不出一个可以如图所示使用的。 (当然,我可以为每个索引器创建一个单独的集合类型 - 但如果可能的话,我想使用一个新的集合类型 - 因为否则代码重复开始成为一个问题。)

性能::重写算法以使用列表来提高性能。我们甚至考虑使用数组,因为少了一个边界检查。因此,任何提议的解决方案都应该具有出色的运行时性能——至少与 List<T> 相当.

因此,最好在编译时类型安全检查之后优化结构(或任何其他技术)。

用例:用例是:

  1. 通过类型安全索引器访问列表中的随机元素。
  2. 对列表进行 for 循环,也使用类型安全索引器。
  3. 对列表使用 foreach。 List 优化其 GetEnumerator() 以返回一个结构,从而避免分配。我想保留它。

最佳答案

您应该能够使用 SortedDictionary<TKey, TValue> 做你想做的事。确保实现 EqualsGetHashCode在您的自定义键类型上。

SortedDictionary允许在保持顺序的同时快速且类型安全地随机访问元素。

如果您需要列表语义以避免重写太多代码,那么使用 SortedDictionary 创建一个类似列表的类型并不难作为后备存储。

关于c# - 向 C# 列表索引器添加编译时安全性——这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com