我想做这样的事情:
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支持以及类型安全性。无论如何要做到这一点?
答案 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)
之类的操作,然后执行正确的null
或default
检查以使其成为两个数组不同的尺寸,使用int?
代替int
等等。