我正在将一个小程序从Typescript移植到C#。在原始程序中,我有很多这样的检查:
var array: T[] = [];
if (!array[1234]) { // do something }
基本上检查1234是否是错误的索引(未定义),或者该项是否由我专门设置为null
或false
。
现在将此移植到C#时我基本上用T[]
替换List<T>
,但我不知道执行此检查的最快方法是什么,因为如果我使用的话无效索引我得到一个例外。
所以我的问题是,检查null
或false
项目的无效索引和索引的最佳方法是什么?
答案 0 :(得分:2)
既然您正在使用C#并且可以访问BCL,那么您应该使用Dictionary进行此类操作。这允许您有效地添加索引并检查它们是否存在。
例如,假设T为string
:
var s = new Dictionary<int, string>();
s[1234] = "Hello";
s[9999] = "Invalid";
var firstIndexCheck = s.ContainsKey(1234) && s[1234] != "Invalid"; // true
var secondIndexCheck = s.ContainsKey(9999) && s[9999] != "Invalid"; // false
答案 1 :(得分:2)
要检查所请求的索引是否在您需要检查的范围内myIndex < myList.Count
。
如果T
是bool
,您可以像{Q}}那样做!myList[ix]
。
在.NET中,由于bool
不可为空,因此您无需检查它是否为空。但是,如果T
可以为空或Nullable<T>
即bool?
,您仍然需要执行== null
检查,并检查它是否为false
public static class ListExtensions
{
public static bool ElementIsDefined<T>(this List<T> list, int index)
{
if (index < 0 || index >= list.Count)
return false;
var element = list[index];
var type = typeof (T);
if (Nullable.GetUnderlyingType(type) != null)
{
if (element is bool?)
return (element as bool?).Value;
return element != null;
}
var defaultValue = default(T);
// Use default(T) to actually get a value to check against.
// Using the below line to create the default when T is "object"
// causes a false positive to be returned.
return !EqualityComparer<T>.Default.Equals(element, defaultValue);
}
}
}。
如果您使用的是.NET 3.5或更高版本,则可以编写扩展方法,以便更轻松地使用它。这是我掀起来处理几乎所有情况的事情(可能都是?)。
Type
快速概述了这一点:
Nullable
是bool?
(bool?,int?等)false
,以便我们能够正确判断是否提供了bool
并根据此返回。false
,则默认为int
,0
为null
,任何引用类型均为var listBool = new List<bool?>();
listBool.Add(true);
listBool.Add(false);
listBool.Add(null);
listBool.ElementIsDefined(0) // returns true
listBool.ElementIsDefined(1) // returns false
listBool.ElementIsDefined(2) // returns false
。 您可以这样称呼它:
List<T>
现在快速说明,这不会是闪电般快速的。它可以拆分为处理不同类型的List<int>
对象,因此您可以根据需要为List<MyClass>
或List<T>
等创建类似方法来删除或添加逻辑,依此类推,但因为我将其定义为使用{{1}},所以此方法将显示所有列表。
答案 2 :(得分:1)
要检查正确的索引,只需检查它是否小于数组/列表大小。
int index = 1234;
List<T> list = new List<T>();
if (index < list.Count) {
}
用于检查空组合索引检查和空检查:
index < list.Count && list[index] != null
(如果您有引用类型数组)