巧妙地添加“和*当我连接两个可能为空的字符串变量

时间:2015-04-23 14:59:28

标签: c#

我有一个代码执行此操作:

if (isNewName())
    name = "newName";
if (isNewLove())
    love = "newLove";

//Generate output message
if (isNewName() && isNewLove)
    result = "Name and Love are updated"
else if (isNewName())
    result = "Name is updated";
else if (isNewLove())
    result = "Love is updated";

我想知道是否有一个小技巧可以让我在一行中生成结果消息,或者以更漂亮的方式生成结果消息。

NB。我知道它完全没用,它可能会影响可读性,我不是在寻找一个好的做法,而只是为了尽可能减少线路的最佳技巧。

3 个答案:

答案 0 :(得分:5)

string.Join(" and ", new []{ name, love }.Where(i => !string.IsNullOrEmpty(i)))

当然,一直这样做会有点笨拙,所以你想把它变成一个扩展方法:

public static string Join(this IEnumerable<string> @this, string separator)
{
  return string.Join(separator, @this.Where(i => !string.IsNullOrEmpty(i)));
}

然后您可以使用它作为例如:

new  []{ name, love }.Join(" and ");

修改

对于问题的第二部分(当只有一个选项时使用is,当有多个时使用are),您可以使用例如这样:

public static string Join(this IEnumerable<string> @this, string separator, 
  string singleFormat, string multipleFormat)
{
  var nonEmpty = @this.Where(i => !string.IsNullOrEmpty(i)).ToArray();

  return string.Format
    (
      nonEmpty.Count == 1 ? singleFormat : multipleFormat, 
      string.Join(separator, nonEmpty)
    );
}

被称为:

new [] { name, love }.Join(" and ", "{0} is updated", "{1} are updated");

答案 1 :(得分:0)

我的两分钱。无法抗拒。

var names = new List<string>(); 
if (isNewName())
    names.Add("Name");
if (isNewLove())
    names.Add("Love");
var op = String.Format("{0} {1} updated.", String.Join(" and ", names), names.Count == 1 ? "is" : "are");

答案 2 :(得分:-1)

我将N()用于IsNewName()L()用于IsNewLove()然后你可以去:

result = N()? "Name" : ""
       + (N()&&L())? " and " : "" 
       + L()? "Love" : ""
       + (N()&&L())? " are " : " is "
       + "updated";

这是一行,分解为适合答案。

根据要求无用。