有没有一种方法可以引用回链中的最后一个表达式作为函数(C#)中的参数

有没有一种方法可以引用回链中的最后一个表达式作为函数(C#)中的参数,c#,c#-4.0,C#,C# 4.0,嗨,我有以下代码: log.Entry = (newEntry ?? "").Substring(0,Math.Min((newEntry ?? "").Length, 50)); log.Entry是nvarchar(50)的数据库字段 所以我想做的是限制为最多50个字符,但也有一个null检查,这样我就不会尝试在null上运行可能引发异常的字符串函数。(?) 我的问题是,第二个(newEntry??“)可以通过某种操作符简化吗? 这已经评估过一次,可能不需要再次评估。 我正在寻找一个单行程

嗨,我有以下代码:

log.Entry = (newEntry ?? "").Substring(0,Math.Min((newEntry ?? "").Length, 50));
log.Entry是nvarchar(50)的数据库字段 所以我想做的是限制为最多50个字符,但也有一个null检查,这样我就不会尝试在null上运行可能引发异常的字符串函数。(?)

我的问题是,第二个(newEntry??“)可以通过某种操作符简化吗? 这已经评估过一次,可能不需要再次评估。 我正在寻找一个单行程序,因此它将类似于lambda风格的语法。(但我猜不是实际的lambda)。

我猜:

newEntry = newEntry ?? "";
og.Entry = newEntry.Substring(0,Math.Min(newEntry.Length, 50));
你可以简单地使用

newEntry?.Substring(0, Math.Min(newEntry.Length, 50))
这样,只要
newEntry
null
,对
子字符串(…)
的调用就不会被调用,整个表达式的计算结果为
null
。一旦到达
SubString()
,您就不必再检查空值,您可以使用
Math.Min(newEntry.Length,50)
进行结算

还是删除
??如果希望
log.Entry
为空,则在末尾显示“
”。如果
newEntry
为空,则条目为空:

log.Entry = newEntry?.Substring(0, Math.Min(newEntry.Length, 50));

您始终可以执行以下操作:

var logEntry = new string(newEntry?.Take(50).ToArray());
铭记:

  • 新字符串(null)
    将创建一个空字符串
    “”
  • 可枚举。Take(n)
    将获取序列的第一个
    n
    元素。如果
    n
    元素较少,则将占用整个序列
  • 与其他解决方案相比,性能要差得多,因为它们不需要枚举
    字符串

几乎所有其他答案都利用了安全导航操作符
?。
,如果我没有错的话,它是在C#6中引入的。但你问题中的标签是C#4.0,所以我认为这对你来说是可行的:

log.Entry= (newEntry!=null ? newEntry.Substring(0, Math.Min(newEntry.Length, 50)):"");

这使用了

虽然其他答案会产生有效的结果,但它们往往会产生重复的代码,从而隐藏您的意图(如果您每次都创建LINQ迭代器并从字符实例化新字符串,则可能会出现性能问题)

对于字符串修剪,我通常使用扩展方法:

public static string TrimTo(this string value, int maxLength)
{
    if (value == null || value.Length <= maxLength)
       return value;

    return value.Substring(0, maxLength);
}

还可以考虑在修剪后的字符串末尾添加省略号。

为什么不存储
newEntry??“
导入新变量?无论如何,即使调用两次,只要
newEntry
本身不是一个查询表达式,或者,
log.Entry=(newEntry!=null?newEntry.Substring(0,Math.Min(newEntry.Length,50)):“”),它也不会对性能产生太大影响这将无法编译。你需要
。。。取(50).ToArray()
。但是好主意@RoleyBaxter此代码隐藏了您正在做的事情的意图(我打赌,一般开发人员会多次阅读此代码,以了解您在这里选择的是子字符串),并且它会给您带来最坏的性能影响(创建迭代器,逐个迭代字符直到计数器达到零,然后选取所有字符并分配数组,然后将数组传递给字符串构造函数并分配新字符串)@SergeyBerezovskiy是的,这是一个选项,我从来没有说过它是最好的。性能比其他解决方案差,我会更新答案以确保它是清楚的。我不同意意向,
Take
new string(char[]chars)
应该很容易理解。很好的选项,谢谢!很好的解释和空条件运算符用法的好答案
public static string TrimTo(this string value, int maxLength)
{
    if (value == null || value.Length <= maxLength)
       return value;

    return value.Substring(0, maxLength);
}
log.Entry = newEntry.TrimTo(50);