2015-08-28 196 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'广泛使用,我不会认为它会降低代码的可读性。在我自己的代码中,我使用隐式运算符。对,我的第一选择是扩展方法或其他方法,但工具仍然可以用于边缘案例 –