C#确定字符串数组中的任何元素是否在任何位置包含给定字符串
我有一个字符串数组:C#确定字符串数组中的任何元素是否在任何位置包含给定字符串,c#,linq,arrays,string,C#,Linq,Arrays,String,我有一个字符串数组: string[] Animals = {"Cat", "Dog", "Fish"}; 然后我想确定哪个元素包含序列“is”,并返回整个元素;在这种情况下,“鱼” 如果我想找到“gh”,它在列表中不存在,因此它应该返回第一个元素,在本例中为“Cat” 我试过这个linq代码,但我认为我做的lambda部分不对 int index = Animals.Where(x => x.IndexOf("is") >= 0).First().IndexOf("is") st
string[] Animals = {"Cat", "Dog", "Fish"};
然后我想确定哪个元素包含序列“is”,并返回整个元素;在这种情况下,“鱼”
如果我想找到“gh”,它在列表中不存在,因此它应该返回第一个元素,在本例中为“Cat”
我试过这个linq代码,但我认为我做的lambda部分不对
int index = Animals.Where(x => x.IndexOf("is") >= 0).First().IndexOf("is")
string result = index > 0 ? Animals[index] : Animals[0];
此代码引发以下错误:
Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: value
我想我已经很接近了,我只是似乎无法理解
这个方法显然不是傻瓜式的,它应该返回第一个可能有问题的“is”实例。我的潜在列表非常小,索引词总是唯一的。试试这个:
string result = Animals.FirstOrDefault(x => x.Contains("is")) ?? Animals.First();
(如果数组不包含任何元素,则此操作将失败;在这种情况下,您希望执行什么操作?您也可以尝试对回退表达式执行FirstOrDefault
——如果序列为空,此操作将返回null
)
根据您的要求,您发布的代码有两个问题:
Enumerable.First
,这将在空序列上引发异常,即如果不存在与原始谓词匹配的项string result = Animals.FirstOrDefault(x => x.Contains("is")) ?? Animals.First();
(如果数组不包含任何元素,则此操作将失败;在这种情况下,您希望执行什么操作?您也可以尝试对回退表达式执行FirstOrDefault
——如果序列为空,此操作将返回null
)
根据您的要求,您发布的代码有两个问题:
Enumerable.First
,这将在空序列上引发异常,即如果不存在与原始谓词匹配的项如果
动物
为空,我建议在???之后使用不带lambda的FirstOrDefault()
,而不是动物[0]
。@jball:如果动物为空
,则仍然会引发异常。但是,如果数组为空,它将返回null
。我不在乎。这种情况不可能发生。已经检查过了。谢谢。这很有效。我一直在使用一个.ToString()方法,其中的“is”似乎无法正常工作。我想我的原始代码可能会工作,但你的代码肯定会工作,所以我不在乎。让它工作吧。在调用ToString()之前,我只需检查我的对象是否为null。谢谢。@Shawn:好的。要使此代码为空安全,需要在取消引用之前检查数组是否为null
,并检查数组中的每个字符串是否为null
。要实现第二个,请将谓词更改为x=>x!=null&&x.Contains(“is”)
如果animates
为null,我建议使用.FirstOrDefault()
而不是在???之后添加lambdaanimates[0]
。@jball:如果animatesnull
,则仍然会引发异常。但是,如果数组为空,它将返回null
。我不在乎。这种情况不可能发生。已经检查过了。谢谢。这很有效。我一直在使用一个.ToString()方法,其中的“is”似乎无法正常工作。我想我的原始代码可能会工作,但你的代码肯定会工作,所以我不在乎。让它工作吧。在调用ToString()之前,我只需检查我的对象是否为null。谢谢。@Shawn:好的。要使此代码为空安全,需要在取消引用之前检查数组是否为null
,并检查数组中的每个字符串是否为null
。要实现第二个,请将谓词更改为x=>x!=null&&x.Contains(“is”)