我有一個數組int[] numArray
。我想知道是否有任何直接的方法來檢查數組中是否有負數?C#,檢查整數數組是否有負數
如果沒有直接的方法,即使linq會做。我對linq有點新鮮。任何人都可以建議
我有一個數組int[] numArray
。我想知道是否有任何直接的方法來檢查數組中是否有負數?C#,檢查整數數組是否有負數
如果沒有直接的方法,即使linq會做。我對linq有點新鮮。任何人都可以建議
你可以使用Any:
bool containsNegative = numArray.Any(i => i < 0)
或者
bool containsNegative = numArray.Min() < 0;
int[] negativeNumbers = numArray.Where(i => i < 0).ToArray();
如果你打開使用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();
版本,或者你可以包裝在擴展方法*老式*的方式,並使用它像LINQ。 – gor
@gor - 哈哈......有趣的是,你在做出評論的同時,我正在將其添加到答案中。好主意。 –
var negativeExist = numArray.Any(a => a < 0);
nm,我是個白癡,我抹掉了我的評論。 –
您可以使用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
*/
傳統:
foreach (int number in numArray) { if (number < 0) return true; }
return false;
使用LINQ:
bool result = numArray.Any(x => x < 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;
}
沒有必要遍歷所有項目。當你找到第一個負項目時,你可以返回。 –
@BalaR這就是爲什麼我發佈的代碼在找到第一個 –
後退出的原因啊,我錯過了循環中的'!res'。不習慣看那樣的條件。 –
如何通過linq檢索所有負數? –
這麼快,非常感謝 –
@IAbstractDownvoteFactory:Any()看起來比Min()更好的解決方案,因爲Any()在找到第一個負數元素時返回true,而Min()始終遍歷整個數組。你可能想在你的答案中指出這一點。 – Alan