請幫忙System.Linq.Aggregate
我有以下課程
public class MainClass
{
public ClassA someProp { get; set; }
public ClassA someProp2 { get; set; }
}
public class ClassA
{
public virtual Type Types => Type.None;
}
public class ClassB:ClassA
{
public override Type Types => Type.Default;
public string FieldName { get; set; }
}
public class ClassC:ClassA
{
public override Type Types => Type.Value;
public int FieldValue { get; set; }
}
我想得到 FieldName 如果它被填寫在 ClassB 或來自 ClassC 的值如果它也被填充為 someProp2 和 someProp
我了解如何獲得 1 個值
//for get name
IEnumerable<string> values = entities
.Where(x=>x.someProp!=null || x.someProp2!=null)
.SelectMany(mainClass => new[] {mainClass.someProp,mainClass.someProp2 })
.OfType<ClassB>()
.Select(classB => classB.FieldName)
//for get value
IEnumerable<int> values = entities
.Where(x=>x.someProp!=null || x.someProp2!=null)
.SelectMany(mainClass => new[] {mainClass.someProp,mainClass.someProp2 })
.OfType<ClassC>()
.Select(classC => classC.FieldValue)
但我不明白如何在 1 個請求中獲取 2 個值,因為會有 2 類類ClassB and ClassC
可能最好的方法是通過聚合方法!
告訴我如何為選擇和聚合方法本身制作條件
uj5u.com熱心網友回復:
如果你想用它.Aggregate()來實作你的目標,我建議你使用一個多載,它可以讓你在展平屬性對之后在累加器函式之外定義一個種子。
它可以按如下方式實作:
IEnumerable<string> values = entities
.SelectMany(ent => new[] { ent.someProp, ent.someProp2 })
.Aggregate(new List<string>(),
( fields, property ) =>
{
if (property is ClassB)
{
fields.Add(((ClassB)property).FieldName);
}
else if (property is ClassC)
{
fields.Add(((ClassC)property).FieldValue.ToString());
}
return fields;
});
在這里,我們的種子是
new List<string>()
我們的累加器函式是
( fields, property ) =>
{
// accumulation logic
return fields;
}
,包含累加器值引數fields和元素引數property。
我們的種子是我們累加器值的初始值。對于property扁平屬性集合中的第一個(由 提供.SelectMany()),我們的累加器值 ( fields) 因此是一個空的字串串列。
對于每個元素 ( property),根據屬性的型別別提取欄位值:
- if
propertyis aClassB,FieldName被提取并添加到我們的累加器值中。 - if
propertyis aClassC,FieldValue被提取,并將其字串值添加到我們的累加器值中。 - (如果
property這些類都不是,則不添加任何內容fields)。
在有條件地將欄位值添加到 之后fields,fields從累加器函式回傳,以用作累加器函式下一次迭代中的累加器值(即,用于property展平集合中的下一次迭代)。
entities給出如下:
List<MainClass> entities = new()
{
new()
{
someProp = new ClassC() { FieldValue = 4 },
someProp2 = new ClassB() { FieldName = "Flower" }
},
new()
{
someProp = new ClassA() { },
someProp2 = new ClassC() { FieldValue = 7 }
}
};
,結果values將包含:
4
花
7
示例小提琴在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/446623.html
