C#7中的多个副词是否可能?

时间:2018-05-17 19:04:49

标签: c# parameters tuples c#-7.2

我想做这样的事情:

public void PrintIDs(params int[] IDs, params string[] names) 
{ 
    // Throw error if arrays aren't same size 

    for (int i = 0; i = IDs.Length; i++) 
        Console.WriteLine($"{names[i]}: {IDs[i]}"); 
} 


... 

PrintIDs(player.ID, "Player ID", computer.ID, "Computer ID"); 
PrintIDs(sword1.ID, "Sword 1 ID", sword2.ID, "Sword 2 ID"); 

但我收到一条错误消息:A params parameter must be the last parameter in the list。我可以只使用一个params object[]但是它会丢失编译器和IDE支持以及类型安全性。无论如何要做到这一点?

1 个答案:

答案 0 :(得分:4)

使用C#7' System.ValueTuple,你可以这样做:

public void PrintIDs(params (int ID, string name)[] namedIDs) 
{ 
    foreach (var namedID in namedIDs) 
       Console.WriteLine($"{namedID.name}: {namedID.ID}); 
} 

或者,更清洁:

public void PrintIDs(params (int ID, string name)[] namedIDs) 
{ 
    foreach (var (ID, name) in namedIDs) 
        Console.WriteLine($"{name}: {ID}); 
} 

如果你喜欢将它们作为两种不同的方式,你可以使用这样的扩展方法:

public static (T1[] array1, T2[] array2) SplitToArrays<T1,T2>(this (T1 t1, T2 t2)[] tuples)
{ 
    var array1 = new T1[tuples.Length]; 
    var array2 = new T2[tuples.Length]; 

    foreach (var (i, tuple) in tuples.Index())
        array1[i] = tuple.t1; array2[i] = tuple.t2; 

    return (array1, array2); 
} 

然后像这样使用它:

public void PrintIDs(params (int ID, string name)[] namedIDs) 
{ 
   (int[] IDs, string[] names) = namedIDs.SplitToArrays(); 

   // OR: 

   var (IDs, names) = namedIDs.SplitToArrays(); 
   for (int i = 0; i = obj.Length; i++) 
        Console.WriteLine($"{names[i]}: {IDs[i]}"); 
} 

无论哪种方式,你都会这样称呼它:

PrintIDs((player.ID, "Player ID"), (computer.ID, "Computer ID")); 
PrintIDs((sword1.ID, "Sword 1 ID"), (sword2.ID, "Sword 2 ID")); 

很酷的是,它们必须具有相同的尺寸,根据我的经验,无论如何我都想要它们。如果您希望它们具有不同的大小,您可能只需执行(player.ID, null)(player.ID, default)之类的操作,然后执行正确的nulldefault检查以使其成为两个数组不同的尺寸,使用int?代替int等等。