字符串连接与三元运算符

Jef*_*eff 9 c# asp.net-mvc

我正在创建SelectList各种联系人.我想证明是一个组合的文本FirstName,MiddleInit(如果可能的话),和LastName.

IEnumerable<SelectListItem> items = contacts
.Select(r => new SelectListItem()
{
    Value = r.ContactID.ToString(),
    Text = r.FirstName + " " 
    + string.IsNullOrEmpty(r.MiddleInit) ? r.MiddleInit + ". " : ""
    + r.LastName
});
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Error   4   Cannot implicitly convert type 'string' to 'bool'   C:\Users\cu551d\Documents\Visual Studio 2010\Projects\WVM\WVM\Controllers\SOWController.cs  181 15  WVM
Run Code Online (Sandbox Code Playgroud)

我猜这与我的语法有关.我能在c#中做这样的事吗?

另外,我应该在Trim()声明中加入声明MiddleInit吗?我认为这个错误非常奇怪IsNullOrEmpty,事实上回复一个bool.我也试过了(string.IsNullOrEmpty(r.MiddleInit) == true ) ..

aka*_*tos 20

尝试在括号中分组.它看起来像你正在向后执行条件运算符:

IEnumerable<SelectListItem> items = contacts
.Select(r => new SelectListItem()
{
    Value = r.ContactID.ToString(),
    Text = r.FirstName + " " +
        (string.IsNullOrEmpty(r.MiddleInit) ? "" : (r.MiddleInit + ". ")) +
        r.LastName
});
Run Code Online (Sandbox Code Playgroud)

另一种技术

既然你要将它转换成空字符串,你也可以考虑这个:

Text = r.FirstName + " " + (r.MiddleInit ?? "") + r.LastName
Run Code Online (Sandbox Code Playgroud)

??被称为Null Coalescing Operator.如果该值不为null,它将返回左侧的任何内容,否则右侧的内容将返回.

http://msdn.microsoft.com/en-us/library/ms173224.aspx

编辑:虽然更清洁,但这对你的情况不太适用,因为你需要在初始之后的时期.但请注意它确实存在!


And*_*per 7

问题是由于运算符优先级导致编译器以您不期望的方式解析表达式.只需将三元表达式包含在parens中,就会礼貌地向编译器解释你的意思.

作为旁注,看一下表达式的逻辑,我认为结果术语的顺序是不正确的.我在下面的代码中切换了它们.

IEnumerable<SelectListItem> items = contacts
.Select(r => new SelectListItem()
{
    Value = r.ContactID.ToString(),
    Text = r.FirstName + " " 
    + (string.IsNullOrEmpty(r.MiddleInit) ? "" : r.MiddleInit + ". ")
    + r.LastName
});
Run Code Online (Sandbox Code Playgroud)

更多解释

没有(,+优先级高于?:,所以你的问题中的表达式被解析,好像它说:

Test = (r.FirstName + " " + string.IsNullOrEmpty(r.MiddleInit)) ? (r.MiddleInit + ". ") : ("" + r.LastName)
Run Code Online (Sandbox Code Playgroud)

因此,您的错误的来源是?:运算符的条件部分实际上是一个字符串 - 它将包含类似"Andrew true"的内容.另请注意,r.LastName?:操作符的第三项结合使用.

Trim()问题

如果有r.MiddleInit可能包含空格,那么使用Trim()会有所帮助,但最好将测试更改为String.IsNullOrWhiteSpace(r.MiddleInit).