C# 经典实例 第二章 集合、枚举器和迭代器 #2.6 测试Array或List<T>中的每个元素

问题:

你需要采用一种容易的方法来测试Array或List<T>中的每个元素。这种测试的结果应该指示集合中的所有元素都通过了测试,或者集合中至少有一个元素没有通过测试。

解决方案:

使用TrueForAll方法,代码如下所示:

  public static void TestArrayForNulls()
        {
            // Create a List of strings
            List<string> strings = new List<string>() { "one", null, "three", "four" };

            // Determine if there are no null values in the List
            string str = strings.TrueForAll(delegate (string val)
            {
                if (val == null)
                    return false;
                else
                    return true;
            }).ToString();

            // Display the results
            Console.WriteLine(str);

            List<string> nulls = new List<string>() { null, null, null, null };
            // Determine if there are all null values in the List
            string result = nulls.TrueForAll(delegate (string val)
            {
                if (val == null)
                    return true;
                else
                    return false;
            }).ToString();

            // Display the results
            Console.WriteLine(result);

        }

讨论:

Array和List<T>类上添加的TrueForAll方法允许你轻松的为这个集合中的元素建立测试。2.6.2节中的代码测试所有元素,以确定是否有任何元素为null。你可以像这样轻松的建立测试,以确定:

  • 是否有任何数值元素大于指定的最大值
  • 是否有任何数值元素小于指定的最小值
  • 是否有任何字符串元素包含一组指定的字符
  • 是否有任何数据对象填充了他们的所有字段
  • 你可能提出的任何其他问题

TrueForAll方法接受一个名为match的泛型委托Predicate<T>,并且返回一个布尔值。

public bool TrueForAll(Predicate<T> match)
match参数确定TrueForAll方法是否应该返回true或false。

TrueForAll方法实质上由一个循环组成,该循环用于遍历集合中的所有元素。在这个循环内调用match委托。如果改委托返回true,就继续处理集合中的下一个元素。如果该委托返回false,就停止处理,并且由TrueForAll方法返回false。如果TrueForAll方法遍历完集合中的所有元素,并且match委托没有为任何元素返回一个false值,TrueForAll方法就会返回True。

并不存在alseForAll方法,不过你可以逆转逻辑并且使用TrueForrAll来完成同样的事情。

List<string> strings = new List<string>() { null, null, null, null };

// 确定列表中是否全是为null的值
string str = strings.TrueForAll(delegate (string val)
{
    if (val == null)
        return true;
    else
        return false;
}).ToString();

// 显示结果
Console.WriteLine(str);

另外一个要考虑的因素是TrueForAll在第一次条件不为true时停止。这意味着并不是所有的节点都进行了检查。假若有一个包含文件或资源的数组需要进行处理或释放,你将需要迭代所有元素,即使在检查过程中执行的操作失败了也是如此。在这种情况下,你想注意是否其中的任何元素失败了,但访问Array或List<T>中的每个元素并执行操作仍然很重要的。

参考:

MSDN文档中的“Array类”“List<T>类”和“TrueForAll方法”主题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值