基本上我有一個具有 2 個不同屬性的物件,int我想從這兩個屬性中獲取一個包含所有值的串列。截至目前,我有幾個 linq 查詢可以為我執行此操作,但我想知道是否可以以某種方式簡化 -
var componentsWithDynamicApis = result
.Components
.Where(c => c.DynamicApiChoicesId.HasValue ||
c.DynamicApiSubmissionsId.HasValue);
var choiceApis = componentsWithDynamicApis
.Select(c => c.DynamicApiChoicesId.Value);
var submissionApis = componentsWithDynamicApis
.Select(c => c.DynamicApiSubmissionsId.Value);
var dynamicApiIds = choiceApis
.Union(submissionApis)
.Distinct();
并非每個組件都有選擇和提交。
uj5u.com熱心網友回復:
通過簡化,我假設您想組合成更少的陳述句。您還可以通過減少迭代集合的次數來簡化執行(當前代碼執行了 3 次)。
一種方法是使用生成器函式(假設您的result.Components集合中的專案型別是Component):
IEnumerable<int> GetIds(IEnumerable<Component> components)
{
foreach (var component in components)
{
if (component.DynamicApiChoicesId.HasValue) yield return component.DynamicApiChoicesId.Value;
if (component.DynamicApiSubmissionsId.HasValue) yield return component.DynamicApiSubmissionsId.Value;
}
}
另一種選擇是使用SelectMany. 訣竅有創建一個臨時列舉持有的相應值DynamicApiChoicesId和DynamicApiSubmissionsId。我想不出一個單線,但這里有一個選擇:
var dynamicApiIds = result
.Components
.SelectMany(c => {
var temp = new List<int>();
if (c.DynamicApiChoicesId.HasValue) temp.Add(c.DynamicApiChoicesId.Value);
if (c.DynamicApiSubmissionsId.HasValue) temp.Add(c.DynamicApiSubmissionsId.Value);
return temp;
})
.Distinct();
@Eldar 的回答給了我一個改進選項 #2 的想法:
var dynamicApiIds = result
.Components
.SelectMany(c => new[] { c.DynamicApiChoicesId, c.DynamicApiSubmissionsId })
.Where(c => c.HasValue)
.Select(c => c.Value)
.Distinct();
uj5u.com熱心網友回復:
與其他一些答案類似,但我認為這用極少量的代碼涵蓋了您的所有基礎。
var dynamicApiIds = result.Components
.SelectMany(c => new[] { c.DynamicApiChoicesId, c.DynamicApiSubmissionsId}) // combine
.OfType<int>() // remove nulls
.Distinct();
uj5u.com熱心網友回復:
要將源串列中的每個元素映射到目標串列中的多個元素,您可以使用SelectMany.
var combined = componentsWithDynamicApis
.SelectMany(x => new[] { x.DynamicApiChoicesId.Value, x.DynamicApiSubmissionsId.Value })
.Distinct();
uj5u.com熱心網友回復:
我還沒有測驗過,但您可以使用SelectMany過濾掉空值,如下所示:
var componentsWithDynamicApis = result
.Components
.Select(r=> new [] {r.DynamicApiChoicesId,r.DynamicApiSubmissionsId})
.SelectMany(r=> r.Where(p=> p!=null).Cast<int>()).Distinct();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344918.html
