10

SelectListさまざまな連絡先を作成しています。表示されるテキストはFirstNameMiddleInit(可能であれば)、および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ます。その値が null でない場合は左側にあるものを返し、それ以外の場合は右側にあるものを返します。

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.LastNameの第 3 項と結合されることに注意してください。?:

Trim() の質問

r.MiddleInit空白が含まれる可能性がある場合は、を使用Trim()すると役立ちますが、テストを に変更することをお勧めし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 に答える