我是LINQ的初学者。
如何将其转换为LINQ语句?
List<Foo> myList = new List<Foo>();
myList.AddRange(// here I add my items);
foreach (Foo x in myList)
{
if (x.IsRequired() == false) throw new Exception();
}
到LINQ语句?像:
myList.ForEach(x => //something here);
我尝试了以下但是这对我不起作用。
myList.ForEach(x => if (x.IsRequired() == false) throw new Exception());
答案 0 :(得分:5)
我说
if (MyList.Any(x => x.IsRequired() == false))
{
throw new Exception();
}
IsRequired()它是一个返回布尔值
的方法
所以你也可以缩短
if (MyList.Any(x => !x.IsRequired()))
{
throw new Exception();
}
答案 1 :(得分:1)
如果您只想查看列表中是否有任何元素,那么fubo给出的答案是好的。如果你想得到实际的元素,你可以这样做:
Foo notRequired = MyList.FirstOrDefault(x => !x.IsRequired());
if ( notRequired != null)
{
// Do something with `notRequired`
}
IEnumerable<Foo> notRequired = MyList.Where(x => !x.IsRequired());
if (notRequired.Count() > 0)
{
foreach (var v in notRequired)
{
// Do something with `v`
}
}
答案 2 :(得分:1)
官方ForEach
不是LINQ声明。它通常只适用于列表。
如果Foo
中的MyList
个对象的IsRequired
值为if (MyList.Any(foo => !foo.IsRequired))
throw new Exception();
,我会假设您要抛出异常。
你的陈述是:
MyList
单词:如果Exception
中的任何foo元素具有错误的IsRequired值,则抛出一个新的var notRequiredFoos = myList
.Where(elementInList => !elementInList.IsRequired);
使用Any而不是在检查之前首先创建列表的好处是,如果你有一个IEnumerable,并且列表中的第一个元素之一会引发异常,那么列表的其余部分就不会被创建徒然。见StackOverflow: What are the benefits of deferred execution?
后来你写道:
问题是我想找到myList中的所有Foo元素 不是必需的。使用Any方法似乎不可能,它会 在第一个失败。
如果要查找列表中不需要的所有Foo元素,您仍然可以使用Linq,使用Enumerable.Where:
foreach (var notRequiredFoo in notRequiredFoos)
{
Console.WriteLine($"Foo element {notRequiredFoo.ToString} is not required");
}
用法:
Enumerable.FirstOrDefault
或者,如果您想在找到异常时立即抛出异常,Linq仍会帮助您:var notRequiredFoo= myList
.Where(elementInList => !elementInList.IsRequired);
.FirstOrDefault();
if (notRequiredFoo != null)
{ // we found a Foo that is not required
throw new MyException(notRequiredFoo);
}
// else: all Foos are required
{{1}}
同样,您仍然不必检查列表中的所有元素,只要找到一个元素,它就会停止。
答案 3 :(得分:1)
阅读完您的评论和其他信息后:
问题是我想找到myList中不需要的所有Foo元素。使用Any方法似乎不可能,它在第一个方法上会失败。
假设Foo
有一些您希望传递给异常的信息,例如string Information
,您可以将所有信息分配给新列表,然后检查Any()
。并在If-Clause中完成所有这些:
List<Foo> temp = new List<Foo>();
if ((temp = MyList.Where(x=>!x.IsRequired()).ToList()).Any())
{
// now pass the information of them all into the exception
throw new Exception(String.Join("\t", temp.Select(y=>y.Information)));
}