检查List <t>的项是否有效</t>

时间:2014-10-04 04:19:09

标签: c# typescript

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

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

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

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

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

3 个答案:

答案 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

如果Tbool,您可以像{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

快速概述了这一点:

  • 检查索引是否在范围内。
  • 检查Nullablebool?(bool?,int?等)
  • 如果是,那么我们必须仔细检查类型是否为false,以便我们能够正确判断是否提供了bool并根据此返回。
  • 然后确定数组中的实际值是否为默认值。如果它是false,则默认为int0null,任何引用类型均为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

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