Help us understand the problem. What is going on with this article?

FirstOrDefaultやSingleOrDefaultでnull以外のデフォルト値を返したい場合の書き方

More than 3 years have passed since last update.

やりたいこと

FirstOrDefaultSingleOrDefaultを使用した時、条件に一致しない場合nullではなく任意のデフォルト値を返したい。

結論

DefaultIfEmpty を使う。
たぶん周知の事実なのだろうけど、調べた時にやりたい事どんぴしゃが無かったので忘備録として残します。

@Ryooooooga さんにコメントにて ??演算子を用いたもっと良い方法を教えて頂きました!ありがとうございます!

  • User.id をチェックし一致しない場合は id=-1 userName="NG" を返す。

サンプルに使用するクラス

public class User(){
    public int id {get;set;}
    public string userName {get; set;}
    public int age {get; set;}
    // ユーザーリストを返すメソッド
    public static List<User> GetUserList(){
        return new List<User> GetUserLists()
        {
            new User(){ id=1, userName="佐藤",age=20 },
            new User(){ id=2, userName="山田",age=30 },
            new User(){ id=3, userName="田中",age=28 },
    }
}

??演算子を使用する。

ID一致時は初期値インスタンスも生成されず、表記もスマートです。C#素晴らしい…

private User TestMethod2(int id){
    return User.GetUserList()
            .FirstOrDefault(x => x.ID == id)
            ?? new User { ID = -1, Name = "NG" };
}

DefaultIfEmptyを使用する場合

ラクチン!
IDが一致するデータが存在した場合も初期値のインスタンスが生成されてしまいます。

private User TestMethod2(int id){
    return User.GetUserList()
        .Where(x=>x.id == id)
        .DefaultIfEmpty(new User(){ id=-1, userName="NG" })
        .First();
}

if文を使用する場合

長い。

private User TestMethod(int id){
    var selectUser = User.GetUserList()
                    .FirstOrDefault(x=>x.id==id);
    if(selectUser != null){ 
        return selectUser;
    }else{
        return new User(){ id=-1, userName="NG" };
    }
}

参考URL

?? 演算子 (C# リファレンス)
Enumerable.FirstOrDefault(TSource) メソッド (IEnumerable(TSource)) (System.Linq)

carbonss
根性系社内SE。インフラ、開発、ITサポート、プロジェクト管理、ハード、ソフト、なんでも泥臭く出来ないなりにやる。15分調べてでわからなかったことは、誰かが15分でたどり着けるようにQiitaに書き残す。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした