gpt4 book ai didi

c# - 检查 List 的项目是否有效

转载 作者:太空宇宙 更新时间:2023-11-03 20:02:51 25 4
gpt4 key购买 nike

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

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

主要检查 1234 是否是错误的索引(未定义)或者该项目是否已专门设置为 nullfalse由我。

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

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

最佳答案

要检查请求的索引是否在范围内,您需要检查 myIndex < myList.Count .

如果Tbool , 你可以做 !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);
}
}

快速了解它的作用:

  • 检查索引是否在范围内。
  • 检查是否 TypeNullable (bool?,int?等)
  • 如果是,那么我们必须仔细检查类型是否为 bool?这样我们就可以正确判断是否 false供应并以此为基础返回。
  • 然后判断数组中的实际值是否为默认值。如果是 bool , 默认为 false , int0 ,任何引用类型都是 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# - 检查 List<T> 的项目是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com