2016-05-23 74 views
4

我有一個對象,它有4個數組參數,都應該是相同的長度。如何輕鬆比較超過2個數組參數的長度?

public Foo(
    int a, 
    int b, 
    type1[] arr1, 
    type2[] arr2, 
    type3[] arr3, 
    type4[] arr4 
    ){ /* ... */ } 

我要確保所有這些陣列都在構造相同的長度,但我顯然無法做到

if (!(arr1.Length == arr2.Length == arr3.Length == arr4.Length)) 

所以我

if (!(arr1.Length == arr2.Length && arr2.Length == arr3.Length && 
     arr3.Length == arr4.Length)) 

去,但這看起來並不特別吸引人,如果我刪除了某個數組或其他東西,就不會那麼清楚。

我想通必須有使用LINQ來做到這一點對他們收集的好辦法,但我的陣列顯然不是在枚舉。然後我有了創造力(可能很愚蠢),並認爲我可以用長度初始化一個哈希集,並檢查它的長度是否爲1。是否有標準/更好的方法來檢查多個數組長度是否相等,或者我的方法與I一樣好可以得到?

+1

正如你似乎已經想通了,你會很難找到比你現有的&&'方法更好的東西。有時候,我喜歡用單獨的行將支票分成多個負值; 'if(arr1.Length!= arr2。長度)拋出新的Up();如果(arr2.Length!= arr3.Length)拋出新的Up();'等等。 –

+1

這些數組多久經常一起作爲一組傳遞?他們總是一起分配等等?如果是這樣,你有沒有考慮將它們隱藏在自定義類中? –

+0

爲什麼要將相關數據作爲不同的數組傳遞,而不是隻有一個具有4個屬性的類的集合呢? –

回答

6

如何編寫一個輔助方法?

public static class Arrays 
{ 
    public static bool AreAllTheSameLength(params Array[] arrays) 
    { 
     return arrays.All(a => a.Length == arrays[0].Length); 
    } 
} 

,你可以調用像這樣:

if (!Arrays.AreAllTheSameLength(arr1, arr2, arr3, arr4)) 
{ 
    // Throw or whatever. 
} 

或者,如果您通常使用的逆轉布爾條件,它可能是更具可讀性提供相反的方法:

public static class Arrays 
{ 
    public static bool HaveDifferingLengths(params Array[] arrays) 
    { 
     return arrays.Any(a => a.Length != arrays[0].Length); 
    } 
} 

... 

if (Arrays.HaveDifferingLengths(arr1, arr2, arr3, arr4)) 
{ 
    // Throw or whatever. 
} 
2

這裏是一個方法使用LINQ

if (new []{arr1.Length, arr2.Length, arr3.Length, arr4.Length}.Distinct().Count() != 1) 
+0

哦,確實,錯過了'!'。 –

2

您可以檢查是否所有符合的第一個:

if (new int[]{ arr2.Length 
       , arr3.Length 
       , arr4.Length 
       } 
       .Any(n => n != arr1.Length) 
    ) 

另一個(更好)選擇是創建一個自定義類,所以你所有類型都有一個項目。然後,您可以簡單地創建一個自定義類的數組:CustomClass[]。由於數據類型已經強制執行,所以不需要檢查它們是否以相等的長度傳入。

0

我可以看到你有4種類型作爲type1到type4。現在,因爲你必須有相等的長度,考慮以下因素:

public class Custom{ 

    public Custom(type1 t1, type2 t2, type3 t3, type4 t4){ 
     this.T1=t1; 
     this.T2=t2; 
     this.T3=t3; 
     this.T4=t4; 
    } 

    public type1 T1 {get; set;} 
    public type2 T2 {get; set;} 
    public type3 T3 {get; set;} 
    public type4 T4 {get; set;} 
} 

現在你的Foo類可以有構造函數:

public Foo(
int a, 
int b, 
params Custom [] array) 
{ /* ... */ } 

自定義類的唯一的構造會確保所有類型1到4被初始化。 在你的Foo類中的數組參數將允許你傳遞儘可能多的元素。 整體效果將是所有類型1到4的變量在Custom類的數組中數量相等。

這更像是間接執行等長規則而不是檢查長度。