2011-09-30 234 views

回答

6

你可以使用Any

bool containsNegative = numArray.Any(i => i < 0) 

或者

bool containsNegative = numArray.Min() < 0; 


编辑

int[] negativeNumbers = numArray.Where(i => i < 0).ToArray(); 
+0

如何通过linq检索所有负数? –

+0

这么快,非常感谢 –

+0

@IAbstractDownvoteFactory:Any()看起来比Min()更好的解决方案,因为Any()在找到第一个负数元素时返回true,而Min()始终遍历整个数组。你可能想在你的答案中指出这一点。 – Alan

7

如果你打开使用LINQ:

var containsNegatives = numArray.Any(n => n < 0); 

或者,如果你想这样做的“老土”的方式......你只需要循环:

var containsNegatives = false; 

foreach(var n in numArray) 
{ 
    if(n < 0) 
    { 
     containsNegatives = true; 
     break; 
    } 
} 

如果你真的想要漂亮的,你可以把它转换成一个扩展方法:

public static class EnumerableExtensions 
{ 
    public static bool ContainsNegatives(this IEnumerable<int> numbers) 
    { 
     foreach(n in numbers) 
     { 
      if(n < 0) return true; 
     } 

     return false; 
    } 
} 

从你的代码中调用它像:

var containsNegatives = numArray.ContainsNegatives(); 
+0

版本,或者你可以包装在扩展方法*老式*的方式,并使用它像LINQ。 – gor

+0

@gor - 哈哈......有趣的是,你在做出评论的同时,我正在将其添加到答案中。好主意。 –

2
var negativeExist = numArray.Any(a => a < 0); 
+0

nm,我是个白痴,我抹掉了我的评论。 –

0

您可以使用Array.Find(T)方法来执行此任务。

public static T Find<T>(
    T[] array, 
    Predicate<T> match 
) 

例如,

using System; 
using System.Drawing; 

public class Example 
{ 
    public static void Main() 
    { 
     // Create an array of five Point structures. 
     Point[] points = { new Point(100, 200), 
      new Point(150, 250), new Point(250, 375), 
      new Point(275, 395), new Point(295, 450) }; 

     // To find the first Point structure for which X times Y 
     // is greater than 100000, pass the array and a delegate 
     // that represents the ProductGT10 method to the static 
     // Find method of the Array class. 
     Point first = Array.Find(points, ProductGT10); 

     // Note that you do not need to create the delegate 
     // explicitly, or to specify the type parameter of the 
     // generic method, because the C# compiler has enough 
     // context to determine that information for you. 

     // Display the first structure found. 
     Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y); 
    } 

    // This method implements the test condition for the Find 
    // method. 
    private static bool ProductGT10(Point p) 
    { 
     if (p.X * p.Y > 100000) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 

/* This code example produces the following output: 

Found: X = 275, Y = 395 
*/ 
0

传统:

foreach (int number in numArray) { if (number < 0) return true; } 
return false; 

使用LINQ:

bool result = numArray.Any(x => x < 0); 
0

有点twidling版本将

public static bool AnyNegative(int[] arr){ 
    const long firstBit = 2147483648; 
    var res = false; 
    for (var i = 0; i < arr.Length && !res; i++) res = (arr[i] & firstBit) == firstBit; 
    return res; 
} 

您可以这样调用>

int arr = {...} 
    if(arr.AnyNegative()){ 
     //do stuf if there's any negative numbers 
    } 

当然,这仅仅是一个模糊的

public static bool AnyNegative(int[] arr){ 
      var res = false; 
      for (var i = 0; i < arr.Length && !res; i++) res = arr[i] < 0; 
      return res; 
} 
+0

没有必要遍历所有项目。当你找到第一个负项目时,你可以返回。 –

+0

@BalaR这就是为什么我发布的代码在找到第一个 –

+0

后退出的原因啊,我错过了循环中的'!res'。不习惯看那样的条件。 –