2016-11-07 114 views
0

比方说,我有以下字符串:C#字符串格式未知大小

string postData = "state={2}&country={3}&geolocation={0}&city={1}"; 

而且我有一个字符串的另一个列表。它的大小在这种情况下最多可以是4。 我想创建一个方法,它取代了我的postData变量中的数字,具体取决于列表大小。类似下面的方法:

private string UnknownSizeStringFormat(string postData, params string[] stringsToReplace) 
{ 
    return string.format(postData, stringsToReplace); 
} 

上述方法效果只要列表的大小为4。问题是,在第一次调用时,我的列表大小可能小于4,所以如果它为0,我想用空字符串替换括号内的每个数字。我的返回值应该是:

"state=&country=&geolocation=&city=" 

如果它的大小是一个,并在列表中的第一个成员是“21,27”我返回的字符串应该是:

"state=&country=&geolocation=21,27&city=" 

等等.. 我可以使用循环或正则表达式来达到这个目的,但是我一直在想是否有更好的方法,Linq解决方案呢?我所知道的是postData最多可以有多少个数字,在我的情况下是4. 同样,我可以用循环或正则表达式来做到这一点,但我试图尽可能缩短它

编辑:postData字符串可能会有所不同。那只是一个例子。如果你可以写在C#6的大小或内容可以是不同

+2

我不知道你的列表是如何填充的,但我想一个简单的解决方案可能是为列表中的缺失项目添加空白字符串。不是说这是一个很好的解决方案,或者它甚至可以在你的特定情况下工作,但这是需要考虑的事情。 –

回答

3

我所知道的是多少号POSTDATA可以有最多

那么这个怎么样:

static string UnknownSizeStringFormat(string format, int maxArgs, params object[] args) 
{ 
    Array.Resize(ref args, maxArgs); 
    return string.Format(format, args); 
} 

所以你可以使用:

string postData = "state={2}&country={3}&geolocation={0}&city={1}"; 
var result = UnknownSizeStringFormat(postData, 4); 
+0

我喜欢这个解决方案! –

+0

简而言之,我喜欢它。谢谢! – Skatz1990

1

,那么我建议你下面的快速解决方案

定义具有作为属性您参考参数和ovveride类ToString方法以这种方式返回你想要的url。

public class CustomUrl 
{ 
    public string State {get;set;} 
    public string Country { get;set;} 
    public string Geolocation {get;set;} 
    public string City {get;set;} 

    public ovveride string ToString() => 
     $"state={State}&country={Country}&geolocation={Geolocation}&city={City}";  

} 

,你可以使用它作为:

var customUrl = new CustomUrl 
{ 
    Geolocation = "21,27"; 
} 

然后调用customUrl.ToString(),你会得到:

"state=&country=&geolocation=21,27&city=" 

在创建另一个客户网址为:

var customUrl = new CustomUrl(); 

和呼叫摹customUrl.ToString()你会得到:

"state=&country=&geolocation=&city=" 

如果你不能在C#写的,你必须修改了一下类的定义,象下面这样:

public class CustomUrl 
{ 
    public string State {get;set;} 
    public string Country { get;set;} 
    public string Geolocation {get;set;} 
    public string City {get;set;} 

    public ovveride string ToString() 
    { 
     retrun string.Format("state={0}&country={1}&geolocation={2}&city={3}",State,Country,Geolocation,City);  
    } 
} 

然而,最好的解决方案可以在Henri格式器Named Formats Redux找到。如果实现了这一点,你可以把它作为一个扩展方法,如下图所示:

var template = "state={state}&country={country}&geolocation={geo}&city={city}"; 
var customUrl = template.HenriFormat(new { geo = "21,72"}); 

我之所以说这是最好的解决办法是,你一旦实现它,你可以在任何地方使用它,而不必为上述情况实施自定义类。

+1

......如果他不允许编写C#6,他可以用'String.Format()'做同样的事情。 –

+0

@EdPlunkett ofcourse,你是非常正确的:) – Christos

0

我会先调整基于stringsToReplace.Length的postData。您可以使用开关/大小写方法来控制它。这是未经测试的代码,所以请使用调试进行验证。

string postData = "state={2}&country={3}&geolocation={0}&city={1}"; 

private string UnknownSizeStringFormat(string postData, params string[] stringsToReplace) 
{ 
    switch(stringsToReplace.Length){ 
     case 0: 
     postData = "state={0}&country={0}&geolocation={0}&city={0}"; 
     break; 
     case 1: 
     postData = "state={0}&country={0}&geolocation={1}&city={0}"; 
     break; 
     case 2: 
     postData = "state={2}&country={0}&geolocation={1}&city={0}"; 
     break; 
     case 3: 
     postData = "state={2}&country={3}&geolocation={1}&city={0}"; 
     break; 
     case 4: 
     postData = "state={2}&country={3}&geolocation={1}&city={4}"; 
     break; 
    return string.format(postData, String.Empty, stringsToReplace); 
    } 
} 
+0

如果我不清楚,我很抱歉,我可能不是。 postData字符串可能不同 – Skatz1990

+0

这些情况下的开关只是无用的代码复制 –

+0

@ Skatz1990“我还有另一个字符串列表,它的大小最多可以是4。 – vipersassassin

1

你可以使用这样的事情:

private string UnknownSizeStringFormat(string postData, params string[] stringsToReplace) 
{ 
    string[] temp = { "", "", "", "" }; 
    Array.ConstrainedCopy(stringsToReplace, 0, temp, 0, stringsToReplace.Length); 
    return string.format(postData, temp); 
}