2014-11-07 2 views
1

У меня есть метод, который обрабатывает двойные массивы. Я поставляю двойные массивы, используя ключевое слово params. Моя проблема в том, что иногда мне приходится пропускать и парные, и я хочу использовать один и тот же метод для обоих типов. В настоящее время метода есть подписьКак сделать двойной или двойной массив в двойной массив всегда в C#

public void DoSomething(params double[][] arrays) 

Над определения методы отлично работает для следующих аргументов:

double [] array = new double []{2,3,5} ; 
double [] anotherarray = new double []{7,8,10} ; 
DoSomething (array, anotherarray) ; 

Я вещь, чтобы передать объект, а затем бросить их в этом методе и использовать поймать блок попробовать, и я не знаю, это правильный подход или существует какой-то элегантный способ справиться с такой ситуацией, потому что я могу иметь смешанные данные в качестве входных аргументов.

public void DoSomething(params object objs) 
{ 
    // for loop 
    try 
    { 
     var tempdata = (double) objs(loop index); 
     double[] data = new double[] { tempdata }; 
    } 
    catch 
    { 
     var tempdata = (double []) objs(loop index); 
     double [] data = tempdata; 
    } 
    // do other opertaion 
} 

Я хочу назвать так:

double [] array = new double []{2,3,5} ; 
double singlevalue = 10 ; 
double [] anotherarray = new double []{7,8,10} ; 
DoSomething (array, singlevalue, anotherarray) ; 
+0

Почему вы не перегружаете метод? –

+0

Я упомянул, что мои данные могут быть смешанного типа и из-за которых я ищу такую ​​функциональность. – User1551892

+0

@JonSkeet: если он делает то же самое, что, например, для парных и синглов, вам не нужно в какой-то момент вызывать общую перегрузку или либо повторить весь код? (извиняюсь, если я нахожусь здесь медленнее в пятницу утром). – Chris

ответ

2

Теперь вы дали пример того, как вы хотите назвать это, я подозреваю, что использование динамической типизации может быть самый простой подход:

public void DoSomething(params object[] values) 
{ 
    foreach (dynamic value in values) 
    { 
     // Overload resolution will be performed at execution time 
     DoSomethingImpl(value); 
    } 
} 

private void DoSomethingImpl(double value) { ... } 

private void DoSomethingImpl(double[] value) { ... } 

вы можете сделать это вручную, если вы хотите:

public void DoSomething(params object[] values) 
{ 
    foreach (object value in values) 
    { 
     if (value is double) 
     { 
      DoSomethingImpl((double) value); 
      // Or: DoSomethingImpl(new[] { (double) value }); 
     } 
     else if (value is double[]) 
     { 
      DoSomethingImpl((double[]) value); 
     } 
     ... 
    } 
} 

Я бы определенно не просто бросил безоговорочно, а затем поймал исключение, которое было брошено. Это ужасное злоупотребление исключениями.

+0

Да, я не чувствовал себя комфортно с блоком try catch.I думал, что я мог бы сэкономить несколько строк кода, и, тем не менее, это кажется трудным. Спасибо за помощь. – User1551892

Смежные вопросы