10

我正在创建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
});

我收到错误消息:

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

我猜这与我的语法有关。我可以在 C# 中做这样的事情吗?

另外,我应该包括一个Trim()声明MiddleInit吗?我认为这个错误很奇怪IsNullOrEmpty,实际上返回一个布尔值。我也试过(string.IsNullOrEmpty(r.MiddleInit) == true ) ..

4

4 回答 4

22

尝试在括号中分组。看起来您正在向后执行条件运算符:

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

另一种技术

由于无论如何您都将其转换为空字符串,因此您也可以考虑这一点:

Text = r.FirstName + " " + (r.MiddleInit ?? "") + r.LastName

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

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

编辑:虽然更干净,但这对您的情况不太适用,因为您需要初始时间之后的时间。但请注意它确实存在!

于 2012-12-04T22:41:23.877 回答
8

问题是由于运算符优先级导致编译器以您不期望的方式解析表达式。只需将三元表达式包装在括号中即可礼貌地向编译器解释您的意思。

作为旁注,查看表达式的逻辑,我认为结果项的顺序不正确。我已经在下面的代码中切换了它们。

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

更多解释

没有(,+的优先级高于?:,因此您问题中的表达式正在被解析,就好像它说:

Test = (r.FirstName + " " + string.IsNullOrEmpty(r.MiddleInit)) ? (r.MiddleInit + ". ") : ("" + r.LastName)

所以你的错误的根源是?:运算符的条件部分实际上是一个字符串 - 它将包含类似“Andrew true”的内容。另请注意,r.LastNamegets 与运算符的第三项相结合?:

Trim() 问题

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

于 2012-12-04T22:42:01.143 回答
1

尝试将你的论点包装在你的三元组中

IEnumerable<SelectListItem> items = contacts
.Select(r => new SelectListItem()
{
    Value = r.ContactID.ToString(),
    Text = r.FirstName + " " 
    + (string.IsNullOrEmpty(r.MiddleInit) ? (r.MiddleInit + ". ") : ("" + r.LastName))
});
于 2012-12-04T22:43:13.317 回答
1

你不需要包装参数,只需要三元......

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

我通过尝试发现我实际上需要...

(!string.IsNullOrEmpty(r.MiddleInit) ? r.MiddleInit + ". " : "")

让它正常工作。

于 2012-12-04T22:57:09.773 回答