如何将这个foreach循环转换为LINQ语句?

时间:2017-02-23 09:53:45

标签: c# linq foreach

我是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());

4 个答案:

答案 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)));
}