问题:
你需要采用一种容易的方法来测试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方法”主题。