[英]C# Linq Query group by check if result is null
如果我有這樣的課程
public class Test
{
public string Id {get; set;}
public string Name {get; set;}
public int Value {get; set;}
}
接着:
List<Test> values = new List<Test>(); // this contains let's say 10 items
我喜歡這個:
var grouped = values.Where(x=>x.Value > 10).GroupBy(x=>x.Name);
我的問題是如何檢查grouped == null
? 或者我如何檢查沒有符合該標准的分組?
我問,因為我喜歡這樣:
if (grouped == null) // this is false although the linq yielded no results
{
}
您可以使用方法Any()
:
var anyItems = grouped.Any();
您不需要檢查null,因為分組將返回空集合而不是null
您可以檢查是否沒有組,如下所示:
var anyGroups = grouped.Any();
如果至少有一個組,則名為Any
的擴展方法將返回true
。 否則它將返回false
。
根據MSDN ,這是GroupBy
方法的簽名:
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector)
從上面可以清楚地看出,該方法返回實現IGrouping
接口的一系列項。 ( IGrouping
表示具有公共密鑰的對象的集合)。 查找序列是否包含元素的簡單方法是使用名為Any
的枚舉擴展方法。
此外,這是一個O(1)
操作 - 使用Any
方法而不傳遞任何謂詞。 使用名為Count
的枚舉擴展方法時,在某些情況下是O(n)
操作。
GroupBy
永遠不會返回null
。 當結果中沒有記錄時,您將獲得一個空的IEnumerable<IGrouping<TKey,TSource>>
對象。
在您的情況下, GroupBy
是不必要的:您可以用它替換它
var anyGreaterThanTen = values.Any(x=>x.Value > 10);
使用Any()
就足夠了,但它不是最優的解決方案。
您顯然需要在找到結果后迭代結果,但在迭代結果之前調用Any()
會導致查詢運行兩次。 對於像這里一樣的簡單示例,這不是什么大問題,但如果它是對數據庫(LINQ to SQL或Entity Framework)的查詢,那么您有兩個數據庫命中。 一旦檢查是否有任何結果,然后在下一步獲取結果。
為避免這種情況,您可以寫:
bool hasResult = false;
// iterating over the result, and performing your task
foreach(var group in grouped)
{
hasResult = true;
// process data
// ...
}
if(!hasResult)
{
// ...
}
檢查結果是否為null時,我遇到同樣的問題。 所以,我調試了它。 我發現當結果沒有組時,它有時沒有元素或1個元素,但是這個元素是null。 因此,要檢查結果不為null的位置,我們應該結合以下兩個條件:
if(grouped.Count() > 0 && grouped.ElementAt(0) != null)
{
//TODO:....enter code here
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.