如何轻松比较2个以上数组参数的长度?

时间:2016-05-23 07:48:00

标签: c# arrays

我有一个有4个数组参数的对象,这些参数都应该是相同的长度。

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在它们的集合上执行此操作,但我的数组显然不是可枚举的。然后我有了创造性(可能很傻)并想通过我可以用长度初始化一个hashset并检查它的长度是否为1.是否有标准/更好的方法来检查多个数组长度是否相等或者是我的&&方法尽我所能?

4 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:2)

这是Linq的一种方法

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

答案 2 :(得分:2)

您可以检查是否所有内容都符合第一个:

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

另一个(更好)选项是创建一个自定义类,因此所有类型都有一个项目。然后,您只需创建自定义类的数组:CustomClass[]。无需检查它们是否以相等的长度传入,因为数据类型已经强制执行。

答案 3 :(得分: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)
{ /* ... */ }

Custom类的唯一构造函数将确保初始化所有type1到4。 您的Foo类中的数组参数将允许您根据需要传递元素。 总体效果将是所有类型1到4的变量在Custom类的数组中的数量相等。

这更像是间接执行等长规则而不是检查长度。