有没有一种方法可以引用回链中的最后一个表达式作为函数(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);