检查列表<;T>;有效

本文关键字:有效 gt lt 列表 检查 | 更新日期: 2023-09-27 18:25:27

我正在将我的一个小程序从Typescript移植到C#。在最初的程序中,我有很多这样的检查:

var array: T[] = [];
if (!array[1234]) { // do something }

它基本上检查1234是否是一个错误的索引(未定义),或者该项是否已被我专门设置为nullfalse

现在,当将其移植到C#时,我基本上是用List<T>替换T[],但我不知道执行此检查的最快方法是什么,因为如果我使用无效索引,我会得到一个异常。

所以我的问题是,检查nullfalse项目的无效索引和索引的最佳方法是什么?

检查列表<;T>;有效

要检查请求的索引是否在界限内,需要检查myIndex < myList.Count

如果Tbool,那么可以像现在一样执行!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,则默认为falseint0,并且任何引用类型都为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

(如果您有引用类型的数组)