2016-10-30 6 views
1

を見つけた場合A.LogOutTimeがnullの場合、私のLINQクエリLINQ - .Split(新しい[] { ''})文字列と設定されたデフォルト値ここでヌル

var listLogOutItems = 
    (from A in data 
    orderby A.FirstName 
    select new { 
     Login = "Logout", 
     Name = A.FirstName + " " + A.SurName, 
     ID = A.Id, 
     LogoutDate = A.LogOutTime.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)[0] 
    }).Distinct(); 

はその後、 "不明" を返すです。どのようにこれを行うことができますか?

+0

SOの質問で水平スクロールを避けてください。私はあなたのコードを適切に再フォーマットしました。(スクロールのビット数が少ししかないので) –

答えて

3

最も単純な方法は、おそらくヌル合体演算子??を使用することです。

LogoutDate = (A.LogOutTime ?? "Unknown").Split(...)[0] 

A.LogOutTimenullであれば、それは代わりに"Unknown"を使用します。ここで

LogoutDate = A.LogOutTime?.Split(...)[0] ?? "Unknown" 

A.LogOutTimenullであれば、Split:あなたの代わりにヌル条件演算子を使用することができ、それはC#6で...私たちは分割を必要としません知っている文字列にSplitを呼び出すことになるので、これは少し非効率的です評価されず、式のその部分の結果はnullになります - 最後にヌル合体演算子が使用されます。余談として

は、むしろ新しいchar[]たびに作成するよりも、あなたにもちょうど静的フィールドを持っているかもしれません:

private static readonly ArrayWithSpace = new[] { ' ' }; 

その後Splitへのすべての呼び出しにそれを再利用します。

+1

@HenkHolterman:そのオーバーロードではありません。最後のパラメータだけが 'params'パラメータである可能性があるため、そうすることはできません。 –

+0

上記のコードを試してみましたが、この条件は同じですが、この条件は です。var listLogOutItems =(Aから順に並べ替えると、A.FirstNameは新しい{ => A.LoginDate =(A.LogOutTime ?? "不明")。Split(new [] {''}、StringSplitOptions)。 RemoveEmptyEntries)[0]、LogoutTime =(A.LogOutTime ?? "不明")分割(new [] {''}、StringSplitOptions.RemoveEmptyEntries)[1] + ""(A.LogOutTime ?? Comments( "このアーカイブを削除しないでください"))。Distinct(); Split(new [] {''}、StringSplitOptions.RemoveEmptyEntries)[2] 動作しません。 – lashja

+0

@AbhilashJA:「働いていない」とは、あなたが見ているものについては決して十分な説明ではありません。理由はかなり明らかです。なぜあなたは「Unknown」を分割したのですか?あなたは1つのエントリだけを取得しますが、2番目のエントリを求めています。それをしないでください。しかし、他のものとは別に、 'A.LogOutTime'のヌル値を*適切な未知の値に変換するためにこの前に別の' select 'を持たなければならないように思えます。 「Unknown Unkonwn Unknown」と表示され、これを常に繰り返す必要はありません。 –

関連する問題