我有一個串列,它是一堆函式,如下所示
var listOfSteps = new List<StepList>
{
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
//72 steps in total
}
我必須根據條件將另一個函式添加到串列中。
int 結果 = 從 someTable 中選擇一些東西
var listOfSteps = new List<StepList>
{
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
if (result = 5) {new display(parameters)}, //This is the additional step to be added
//72 steps in total
}
我試圖避免為一個簡單的 if 條件創建 2 個不同的集合,如下所示
if(result = 5)
{
var listOfSteps = new List<StepList> //list with the new function
{
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
new display(parameters),
//72 steps in total
}
}
else
{ //list without the new function
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
//72 steps in total
}
有沒有辦法在串列創建中實作這個條件?
uj5u.com熱心網友回復:
集合初始值設定項只是語法糖。例子:
var ints = new List<int> { 1, 2, 3 };
// is equivalent to
var temp = new List<int>();
temp.Add(1);
temp.Add(2);
temp.Add(3);
var ints = temp;
這意味著您之后可以簡單地有條件地添加這個新專案:
var listOfSteps = new List<StepList>
{
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
...
}
if (result == 5) {
listOfSteps.Add(new display(parameters));
}
uj5u.com熱心網友回復:
我認為如果您可以添加一種新的步驟 - “什么都不做”,那將會非常具有可讀性:
// shouldn't StepList be renamed to "Step"?
class DoNothing: StepList {
...
// implement this so that when the list of steps is processed,
// this will do nothing
}
然后,您可以使用簡單的三元運算子:
var listOfSteps = new List<StepList>
{
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
result == 5 ?
new display(parameters)
:
new DoNothing(),
}
如果您可以為所有步驟創建工廠方法,那么它會更具可讀性,這樣您就不會一直使用這個詞new。
您還可以使用 switch 運算式:
var listOfSteps = new List<StepList>
{
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
result switch {
5 => new display(parameters),
_ => new DoNothing(),
}
}
如果您要做出更復雜的決定,這將非常有用。
如果步驟串列中的步驟數很重要,您可以在檢查計數時始終DoNothing使用 a 從串列中洗掉步驟Where。
listOfSteps.Where(step => step is not DoNothing).Count()
uj5u.com熱心網友回復:
我想這StepList是一個在遇到它的物件時會導致執行某些操作的類。您面臨的問題是,根據外部條件,StepList應該添加或不添加一個物件,這會使List初始化復雜化,對嗎?
如果這是問題所在,那么您可以引入一個特殊的“什么都不做”StepList子類,例如稱為Empty. 您的串列初始化將如下所示:
var listOfSteps = new List<StepList>
{
new Setup(parameters),
new InitializeClass(parameters),
new calculate(parameters),
(result == 5 ? new display(parameters) : new Empty())
// ... 72 steps in total
}
使用這種設計,您的串列將始終具有相同數量的專案,但它們的執行結果將取決于外部條件。
uj5u.com熱心網友回復:
我會使用IEnumerableas 回傳型別的方法,并yield return在必要時執行s。
例如。
private IEnumerable<StepList> GetSteps()
{
yield return new Setup(parameters);
yield return new InitializeClass(parameters);
yield return new calculate(parameters);
if (result = 5) yield return new display(parameters);
...
}
然后像這樣初始化串列:
var listOfSteps = GetSteps().ToList();
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389243.html
