要检查请求的索引是你需要检查myIndex < myList.Count
的范围内。
如果T
是bool
,你可以像你已经做的那样做!myList[ix]
。
在.NET中,由于bool
不能为空,所以不需要检查它是否为空。但是,如果T
为空或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
(布尔?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<int>
或List<MyClass>
等创建类似的方法,则可以删除或添加逻辑,但是因为我将其定义为使用List<T>
,所以此方法将显示所有列表。