C#字符串格式未知大小

时间:2016-11-07 20:33:55

标签: c# linq string.format

我们说我有以下字符串:

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="

如果它的大小为1,则列表中的第一个成员是" 21,27"我的返回字符串应为:

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

依旧...... 我可以为此目的使用循环或正则表达式,但我一直想知道是否有更好的方法,也许是Linq解决方案?我所知道的是postData最多可以拥有多少个数字,在我的例子中是4。 同样,我可以通过循环或正则表达式来做到这一点,但我试图让它尽可能短

编辑:postData字符串可能会有所不同。那只是一个例子。它的大小或内容可能不同

4 个答案:

答案 0 :(得分:3)

  

我所知道的是postData最多可以拥有多少个数

那怎么样:

ul {
  list-style: none;
  display: table;
  padding: 0;
}

ul li {
  display: table;
  height: 100%;
}

ul li div:not(:nth-child(3)) {
  float: left;
  width: calc(50% - 10px);
  margin: 5px;
  display: table-cell;
  background: #6da5ff;
}

.right {
  text-align: right;
}

ul li div:nth-child(3) {
  clear: left;
  width: 100%;
}

ul li div ul {
  width: 100%;
}

ul li div ul li {
  display: inline-block;
  width: calc(50% - 10px);
  background: #6da5ff;
  vertical-align: top;
  margin: 5px;
}

li + li {
  width: 100%;
  margin: 10px 0;
}

所以你可以使用:

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

答案 1 :(得分:1)

如果您被允许使用C#6编写,那么我建议您使用以下快速解决方案

定义一个类,该类具有您引用的参数作为属性,并以这种方式切换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"});

我之所以说这是最好的解决方案的原因是您可以实现一次并且可以在任何地方使用它,而无需为上述情况实现自定义类。

答案 2 :(得分:1)

您可以使用以下内容:

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

答案 3 :(得分:0)

我首先要根据stringsToReplace.Length调整postData。您可以使用开关/案例方法来控制它。这是未经测试的代码,因此请使用debug进行验证。

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);
    }
}