2016-05-25 2 views
2

У меня есть класс, который в основном предоставляет 2d-массив его вызывающему (после разбора файла). Он возвращает этот массив в порядке, но мне нужно предоставить способ для этого вызывающего объекта преобразовать этот 2d-массив в строку с несколькими разделителями. псевдокод ниже.C# .net переопределить ToString для массива multiD

Полное описание: Большая часть моего времени сценарии в других программах, поэтому я немного ржавый на объектно-ориентированном программировании в реальности, и особенно в C#

Я хочу, чтобы абонент, чтобы иметь возможность:

string[,] results; 
getArray (arg1, arg2, etc, out results); 
Debug.WriteLine(results.ToString(delim1, delim2)); 

, но я не ясно, о том, как создать это переопределение для ToString(), что-то вроде:

public override string[,] ToString(string rowSeparator, string columnSeparator) 
{ 
    string retVal = ""; 
    for(int r = 0; r < this.getUpperBound(0); r ++) 
    { 
     for (int c = 0; c < this.getUpperBound(1); c++) 
     { 
      retVal += this[r,c]; 
      if (c + 1 < this.getUpperBound(1)) 
      { 
       retVal += columnSeparator; 
      } 
     } 
     if (r + 1 < this.getUpperBound(0)) 
     { 
      retVal += rowSeparator; 
     } 
    } 
    return retVal; 
} 
+1

Вы имели в виду 'ToString' в вашем коде кода? –

+1

@JonSkeet, да. Спасибо, что спросили, я отредактировал, чтобы показать, что – Keith

+2

В стороне, если вы контролируете 'getArray', почти наверняка будет лучше * вернуть *, чтобы вместо использования параметра' out' и следовать соглашениям об именах .NET , –

ответ

5

это не перекрывая в nything - вы пытаетесь сделать перегруз существующий метод ToString. Хорошая работа, которую вы не пытаетесь переопределить, поскольку вы в принципе этого не можете сделать - вы можете переопределять только члены в объявлении класса, и вы не можете объявить класс string[,] самостоятельно.

Вы можете достичь своей цели с extension method:

public static class ArrayExtensions 
{ 
    public static string ToString(
     this string[,] array, string rowSeparator, string columnSeparator) 
    { 
     // Code as per your method, but using array instead of this 
    } 
} 

Обратите внимание, что абоненты должны будут иметь using директиву для пространства имен, содержащего ArrayExtensions или using static директивы для самого ArrayExtensions класса, для того, чтобы использовать это как метод расширения.

Я бы рекомендовал использовать в вашей реализации StringBuilder вместо repeated string concatenation.

+0

Я предполагаю, что у вас есть правильный ответ здесь, но я не могу получить правильную директиву. вы могли бы показать фрагмент от вызывающего? – Keith

+2

@Keith: Хорошо, если 'ArrayExtensions' находится в пространстве имен' Foo.Bar', вам просто нужно использовать директиву 'using Foo.Bar;' –

+0

Спасибо, Джон, это очистило его, потому что я фактически разделяю пространство имен здесь между классами, поэтому мне не нужна директива using. окончательный вызов - 'results = res.ToString (" \ r \ n "," \ t ");'. блок испытаний работает, спасибо! – Keith