2016-09-19 45 views
0

我想編寫一個代碼,每25次,程序應該返回運行Part_1_code如下。這裏有一個問題,Part_2_codePart_1_code中有很多變量,所以下面的代碼是不允許的,但是我們不能在開頭聲明這些變量,因爲它們都是匿名類型(只讀),所以如何解決這個問題?我不想創建一個新班級。C#創建變量之前如果

int Count = 1; 
foreach (DateTime Date in TestDate) 
{ 
    if(Count == 1 || Count == 25){ 
     Part_1_code; 
     Count = 1; 
    } 

    Pair_2_code; 

    Count++;     
} 
+0

所以,我理解這一點; 'Part_2_Code'使用'Part_1_Code'創建的變量? – Jamiec

+0

一種方法是創建某種Context對象,填充它並在方法之間傳遞它。你說(不要創建新的類),爲什麼你不想創建一個新的類? – Milney

+1

這就是爲什麼人們總是告訴你避免副作用......你能否嘗試將Part_1_code分成兩種方法?一個聲明和初始化的東西,另一個只執行真實的行爲? –

回答

1

變量也必須在該範圍內所定義,或父(外)的範圍。除此之外,在這種情況下使用簡單的for循環可能會更簡單,並與模塊(%)運算符結合使用。如果你每24次執行一次你的「特定」代碼,它的寫法就會稍微精確一些。在類似C語言中使用基於1的索引非常尷尬。

for (var count = 0; count < TestDates.Count; count++) 
{ 
    var date = TestDates[count]; 

    SomeStuff stuff = null; 
    if (count % 24 == 0) 
    { 
     // runs on 0, 24, 48, ... 
     stuff = new SomeStuff(); 
    } 

    // runs on each iteration, 'stuff' will be non-null only if 
    // previous part was executed. 
} 

您也可以提取這些分支進入方法,並通過共享狀態作爲參數:

// decide whether this should be outside the loop 
// (i.e. keep the state from previous iterations), 
// or declared within the `for` loop 
var state = new SharedState(); 

for (var count = 0; count < TestDates.Count; count++) 
{ 
    var date = TestDates[count]; 
    if (count % 24 == 0) 
    { 
     // runs on 0, 24, 48, ... 
     ProcessPart1(state); 
    } 

    // runs on each iteration 
    ProcessPart2(state); 
} 

哪裏SharedState包含你需要這些部門之間共享任何數據:

class SharedState 
{ 
    public int SomeValue { get; set; } 
    public string SomeOtherValue { get; set; } 
} 

如果您的ProcessPart1方法返回一個值,您甚至可以使用三元運算符來簡化代碼:

for (var count = 0; count < TestDates.Count; count++) 
{ 
    var date = TestDates[count]; 

    // runs on 0, 24, 48, ... 
    var someData = (count % 24 == 0) ? Process1(date) : null; 

    // runs on each iteration 
    Process2(someData); 
} 

一種選擇是使國家在父類中的私有字段,但拇指的共同規則是儘量限制你的變量的範圍儘可能地。

當然,如果您發佈了一些在這兩個分支中執行的實際代碼,也許可以稍微更好地重構代碼。

0

考慮一下,如果你要是不跑 然後裏面所有的變量將是空會發生什麼。

您不能使用超出範圍的變量。 之前如果 您可以創建變量,並在您若

int Count = 1; 
     foreach (DateTime Date in TestDate) 
     { 
      int someVariable; 
      if(Count == 1 or Count == 25){ 
       Part_1_code that set the somevariable value; 
       Count = 1; 
      } 


      Pair_2_code that can access someVariable; 

      Count++;     
     } 
0

這看起來非常簡單的添加值,Part_1_Code可以只是返回你的數據的功能。

int Count = 1; 
Part1Result p1 = null; 
foreach (DateTime Date in TestDate) 
{ 
    if(Count == 1 or Count == 25){ 
     p1 = Part_1_code(); 
     Count = 1; 
    } 

    //Part_2_code 
    //use variable p1 here - its the results from Part1Code 
    Count++;     
} 

別處這需要在一定範圍內可訪問的

public Part1Result Part_1_code() 
{ 
    return new Part1Result(){ SomeData = "foo" }; 
} 
0

您可以通過使用一個虛擬值初始化匿名類型:

var Count = 1; 
var someAnonymous = new {Date = new DateTime(), Count = 0}; // init with dummy values 
foreach (DateTime Date in TestDate) 
{ 

    if(Count == 1 || Count == 25){ 
     // Part_1_code 
     Count = 1; 
    } 

    // Part_2_code 

    Count++;     
} 

匿名類型是隻讀的,不能更改其屬性的值,但可以通過再次分配給它更換整個變量而不改變任何財產。