我有一个代码执行此操作:
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。我知道它完全没用,它可能会影响可读性,我不是在寻找一个好的做法,而只是为了尽可能减少线路的最佳技巧。
答案 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";
这是一行,分解为适合答案。
根据要求无用。