2011-09-30 232 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'。不習慣看那樣的條件。 –