Используя 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
и т. д.