Это возможно для нескольких параграфов в C # 7? - PullRequest
0 голосов
/ 17 мая 2018

Я хочу сделать что-то вроде этого:

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 голосов
/ 17 мая 2018

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

...