2015-08-28 194 views
1

我有一個返回字符串數組的方法。在那個方法中,我只處理一個字符串,並且我想把它作爲一個字符串數組返回(只有一個元素的字符串數組,這是我的字符串→array[0] == myString)。將字符串轉換爲動態字符串數組

我想是因爲我想避免一些醜陋的代碼與一個要素創建一個字符串數組,這樣的:

private static string[] FooterContent() 
{ 
     string[] array = new string[1]; 
     array[0] = GetMyData(); 
     return array;   
} 

我想這樣的事情:

private static string[] FooterContent() 
{ 
     string myData = GetMyData(); 
     return myData.ToArray();   
} 

myData.ToArray()應創建一個只有一個元素的數組(array[0] = myString),然後返回它。

或者類似的東西(如果可能):

private static string[] FooterContent() 
{ 
    return GetMyData().ToArray();   
} 

的一點是,我不能簡單地修改從string[]返回類型string因爲我用從FooterContent(數組返回的值字符串)以及其他類似方法(如BodyContentHeadContent)轉換爲接受字符串數組的另一種常規方法WriteContent()

有沒有一個這樣做的優雅方式?

謝謝你的尊敬。

+1

什麼是'GetMyData'和又有什麼回報呢? – Sayse

+0

GetMyData返回一個字符串 –

+0

爲什麼不只是返回一個數組?或者更好,一個對象? – Sayse

回答

8

由於w0lf的意見建議,創建一個數組的最簡單的方法也只是:

return new[] { GetMyData() }; 

雖然你可以創建一個擴展方法,我個人不會 - 如果你這樣做,你絕對應該而不是稱之爲ToArray,因爲string由於Enumerable.ToArraystring實現IEnumerable<char>的事實已經具有含義。

如果你真的想創造這個擴展方法,我會做它:

public static T[] ToSingleElementArray(this T value) 
{ 
    return new[] { value }; 
} 

然後你可以使用:

return GetMyData().ToSingleElementArray(); 

但正如我所說,我不會」 t甚至創建擴展方法...

3

試試這個,

private static string[] FooterContent() 
{ 
    return new[] { GetMyData() }; 
} 
4

您可以:

private static string[] FooterContent() 
{ 
    return new[] { GetMyData() };   
} 

或編寫擴展方法,是不是最好的方法這裏(但有可能):

public static class StringExtensions 
{ 
    public static string[] ToSingleElementArray(this string inputString) 
    { 
     return new[] { inputString }; 
    } 
} 

private static string[] FooterContent() 
{ 
    return GetMyData().ToSingleElementArray();   
} 
+2

調用它'ToArray'是一個壞主意IMO,由於與Enumerable.ToArray'的碰撞。 –

+0

正確! 'ToArray'在這裏不是真正的名字 - 讓我們把它改爲你建議的東西 – Fka

1

或者,您可以將GetData返回值包裝在struct和使用隱運營商來執行轉換:

public struct DataResult 
{ 
    private string _raw; 
    private string[] _rawArray; 

    public DataResult(string raw) 
    { 
     _raw = raw; 
     _rawArray = new [] { raw }; 
    } 

    private string Raw { get { return _raw; } } 
    private string[] RawArray { get { return _rawArray; } } 

    public static implicit operator string(DataResult result) 
    { 
     return result.Raw; 
    } 

    public static implicit operator DataResult(string rawResult) 
    { 
     return new DataResult(rawResult); 
    } 

    public static implicit operator string[](DataResult result) 
    { 
     return result.RawArray; 
    } 

    public static implicit operator DataResult(string[] rawResultArray) 
    { 
     if(rawResultArray == null || rawResultArray.Length != 1) 
      throw new ArgumentException("Raw result must be a single item array", "rawResultArray"); 

     return new DataResult(rawResultArray[0]); 
    } 
} 

隱運營商讓你做隱式轉換從蘋果梨(反之亦然):

DataResult result = new DataResult("hello world"); 
string[] resultArray = result; 
string rawResult = result; 

DataResult result2 = new string[] { "hello world" }; 
DataResult result3 = "hello world"; 

是什麼意思?如果GetData方法返回DataResult任何其他代碼可將其值設置爲一個stringstring[]DataResult,並且隱式地執行相反的轉換。

我相信,在你的情況,這應該是最好的方法之一。

+0

在可讀性方面,對我來說看起來像一個痛苦的世界 - 而且這個結構是* mutable *的事實更加糟糕,IMO。 –

+0

@JonSkeet好吧,我可以把它變成*不可變* –

+0

@JonSkeet順便說一句關於隱式運算符的可讀性始終存在討論......有時候是一個很好的解決方案。例如,'StackExchange.Redis'廣泛使用,我不會認爲它會降低代碼的可讀性。在我自己的代碼中,我使用隱式運算符。對,我的第一選擇是擴展方法或其他方法,但工具仍然可以用於邊緣案例 –