2017-04-20 72 views
0

如果Linq函數All對該集合返回true,是否可以編寫單行查詢來選擇集合的某些項目?我的問題來自All()返回一個布爾值,而不是最初的列表。單行查詢,如果All()返回true,則選擇某些項目

我舉個簡短的例子。假設我們有帳戶的列表:

class Account 
{ 
    public DateTime? CloseDate { get; set; } 
    public decimal? AmountOnCloseDate { get; set; } 
} 

是否有可能有一個選擇帳戶(從給定的帳戶列表)單行查詢與AmountOnCloseDate比一些規定值的情況,但只有當所有的賬戶都他們的CloseDate大於一些給定值?

+0

很難理解你想要什麼,你能告訴我們一個你想要做什麼的例子嗎? – TheLethalCoder

+0

這算作單線嗎? 'selectedAccounts = accounts.All(x => x.CloseDate.Value> 1)? Enumerable.Empty ():account.Where(x => x.AmountOnClaseData> 1);' –

+0

@TheLethalCoder,請參閱Mateusz Krzaczek的評論中的示例。 – HeyJude

回答

0

這是可能的,只有你要做的事情是,你希望它保持空白,如果.All()未能分配到一個新的列表:

List<Example> newList = 
    (originalList.All(r => r.A > 5)) 
    ?originalList.Where(r => r.B > 1).ToList() 
    : new List<Example>(); 

或者你可以做.All()檢查的地方,那DRASTICALLY降低性能,但不需要三元運算符。

List<Point> newL = originalList 
    .Where(r => r.X > 34 && originalList.All(t => t.Y > 241)) 
    .ToList(); 

免責聲明:沒有在1號線,僅缺點這樣做的優點。在現實世界的場景中,我總是建議不要這樣做,只是建議if。

提示:固守如果

+0

這是單行的,但比正常的if語句更不可讀。 – TheLethalCoder

+1

@TheLethalCoder那不是問題 – EpicKip

+0

是的,但我寧願有更多的可讀代碼比較短的代碼,我希望大多數開發人員會。 – TheLethalCoder

0

我不相信這是可能的,你會得到正對Allif然後最接近的Select

if (accountList.All(a => a.CloseDate.Value > someValue)) 
{ 
    var result = accountList.Where(a => a.AmountOnCloseDate > someOtherValue); 
} 

注意,我要提醒你留下來與正常if聲明因爲三元變得不太可讀。

0

我想不出任何C#語句/塊/程序無法進行 「單線」(除#指令)

var result = new[] { accounts }.Where(g => g.All(a => a.CloseDate > DateTime.Now)) 
      .SelectMany(g => g).Where(a => a.AmountOnCloseDate > 42).ToList(); 
相關問題