检查列表<;T>;有效
本文关键字:有效 gt lt 列表 检查 | 更新日期: 2023-09-27 18:25:27
我正在将我的一个小程序从Typescript移植到C#。在最初的程序中,我有很多这样的检查:
var array: T[] = [];
if (!array[1234]) { // do something }
它基本上检查1234是否是一个错误的索引(未定义),或者该项是否已被我专门设置为null
或false
现在,当将其移植到C#时,我基本上是用List<T>
替换T[]
,但我不知道执行此检查的最快方法是什么,因为如果我使用无效索引,我会得到一个异常。
所以我的问题是,检查null
或false
项目的无效索引和索引的最佳方法是什么?
要检查请求的索引是否在界限内,需要检查myIndex < myList.Count
。
如果T
是bool
,那么可以像现在一样执行!myList[ix]
。
在.NET中,由于bool
不可为null,因此不需要检查它是否为null。但是,如果T
可以为null或Nullable<T>
,即bool?
,则仍然需要进行== null
检查,并检查它是否不是false
。
如果您使用的是.NET 3.5或更高版本,您可以编写一个扩展方法,使其对您来说更容易。这是我为处理几乎所有案件(也许全部?)而准备的东西。
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);
}
}
快速概述它的作用:
- 检查索引是否在界限内
- 检查
Type
是否为Nullable
(bool?、int?等) - 如果是,那么我们必须仔细检查类型是否为
bool?
,这样我们才能正确地确定是否提供了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>
,所以此方法将显示在所有列表中。
既然您正在使用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
要检查正确的索引,只需检查它是否小于数组/列表大小。
int index = 1234;
List<T> list = new List<T>();
if (index < list.Count) {
}
用于检查空组合索引检查和空检查:
index < list.Count && list[index] != null
(如果您有引用类型的数组)