2013-06-19 207 views
2

我有一个对象具有一些属性用分隔符连接字符串并考虑到空字符串

例如,

Employee 
-Name 
-Company 

我希望得到他们的名字和公司的一个格式化字符串以“ - ”隔开。

现在我可以做一个string.Join("-", e.Company, e.Name)但是如果公司为空或空我得到“ - fred”。

有没有更好的内置方法来考虑这些空白/空字符串。我以前使用一些简短的ifs来包含 - 在string.format中,但看起来相当混乱。

即。

string.Format("{0}{1}{2}", e.Company, !string.IsNullOrWhiteSpace(e.Company) ? "-": string.Empty, e.Name); 

回答

3

您可以尝试使用Join方法中的内嵌terniary:

string.Join("-", string.IsNullOrEmpty(e.Company) ? "fired" : e.Company, e.Name) 

编辑(我误读 '弗雷德' 拼写错误的解雇)。
正如在另一个答案中提到的,扩展方法将清理代码。你会将难看的代码移动到不同的地方。

作为一个扩展方法的替代方案中,我建议类似的东西允许更多的参数在稍后的时间如下:

public static string ExcludeEmptiesJoin(params string[] args) { 
    string outValue = string.Empty; 

    foreach (var arg in args.Where(s => !string.IsNullOrEmpty(s))) { 
     if (string.IsNullOrEmpty(outValue)) { 
      outValue = arg; 
     } else { 
      outValue = string.Join("-", outValue, arg); 
     } 
    } 

    return outValue; 
    } 

用法:

Console.WriteLine(ExcludeEmptiesJoin("Company", "Fred")); 
Console.WriteLine(); 
Console.WriteLine(ExcludeEmptiesJoin("", "Fred")); 
Console.WriteLine(); 
Console.WriteLine(ExcludeEmptiesJoin("Company", "")); 
Console.WriteLine(); 
Console.WriteLine(ExcludeEmptiesJoin("Company", "", "4/4/1979")); 
Console.WriteLine(); 
Console.WriteLine(ExcludeEmptiesJoin("Company", "Fred", "4/4/1979")); 

输出:

Company-Fred

弗雷德

公司

公司-4 /1979分之4

公司弗雷德-4 /1979分之4

+0

他有一个内嵌他的问题是三元的。 –

+0

这看起来像是一个很好的方法,它会测试它,并标记正确,如果它的所有好 –

+0

如果你去这个解决方案,我会建议用'StringBuilder'替换'string.Join'。 – venerik

0

我怀疑你要简化你比这更多已经有了,但是如果这种模式经常被使用,你可以将分隔符处理移动到一个扩展方法来“清除”一点;

static class StringExtensions 
{ 
    public static string RemoveLeadingOrTrailingToken(this string value, string token) 
    { 
     if (value.StartsWith(token)) 
      return value.Substring(token.Length); 
     if (value.EndsWith(token)) 
      return value.Substring(0, value.IndexOf(token, StringComparison.Ordinal)); 

     return value; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s1 = "company"; 
     string s2 = "product"; 
     string result = String.Format("{0}-{1}", s1, s2).RemoveLeadingOrTrailingToken("-"); 
    }  
} 
0

以内嵌三元出来大概是清洁:

= string.IsNullOrWhiteSpace(e.Company) ? e.Name : string.Join("-", e.Company, e.Name); 
0

如果有两个以上的属性,说一个地址,这能解决你的问题:

List<string> attributes = new List<string>(new string[] { 
    e.Company, 
    e.Name, 
    e.Address}); 
attributes.RemoveAll(s => s == String.Empty); 
String.Join("-", attributes.ToArray()); 
+0

我想到了这一点,但后来决定不得不创建一个列表是更多的开销。但感谢您的答案 –