假设我有一个类似下面的Arraylist(arr1)
"String1 is present"
"String2 is present"
"String3 is present"
我想看看此数组列表中是否存在“ String2”。我做了类似以下的事情:
var containsstringmatch = arr1.OfType<string>().Any(arg=>arg.Contains("String2"));
if (containsstringmatch==true)
{
IEnumerable v1 = arr1.OfType<string>().Where(arg=>arg.Contains("String2"));
foreach (string s in v1)
{
st1 = s;
}
Console.WriteLine(st1);
}
这给了我下面很好的输出:
"String2 is present"
我想看看如果不使用foreach循环就可以实现这一目标。有人可以提供有关操作方法的建议吗。
谢谢
答案 0 :(得分:1)
我现在不应该在.NET中使用ArrayList
,而应该使用List<T>
(如果可能的话是 )。
至:
我想看看如果没有我使用foreach是否可以实现 循环。
如果这样,则意味着您要避免使用foreach
构造并直接执行所有操作:
arr1.OfType<string>()
.Where(arg => arg.Contains("String2"))
.ToList()
.ForEach(s => Console.WriteLine(s));
或者如果您只想找到满足上述条件的最后一个元素:
var result = arr1.OfType<string>().LastOrDefault(arg => arg.Contains("String2"));
答案 1 :(得分:1)
如果只想打印包含搜索的第一个字符串,则可以使用FirstOrDefault()
:
var foundString = arr1.OfType<string>().FirstOrDefault(arg => arg.Contains("String2"));
Console.WriteLine(string.IsNullOrEmpty(foundString) ? "Not found" : foundString);
此外,正如Aomine在他的回答ArrayLists中所写的那样,当我们使用.Net 1.1时,它在那里很好。由于.Net 2.0引入了泛型,因此应避免使用ArrayLists。
正如Rufus L在他的评论中所写,您当前的代码将获取包含搜索字符串而不是第一个字符串的 last 字符串。如果要最后一个而不是第一个,则只需使用LastOrDefault
而不是FirstOrDefault
。
答案 2 :(得分:-1)
没有foreach
或for
循环就无法做到这一点。但是您可以创建一个扩展方法,该方法会将代码移出您的方法。
public static class ConsoleExtensions
{
public static void WriteToConsole(this IEnumerable<string> list)
{
foreach (string item in list)
Console.WriteLine(item);
}
}
用法:
arr1.OfType<string>().Where(arg=>arg.Contains("String2")).WriteToConsole();