0

次のコード スニペットを使用して、 Name に基づいて特定のものを選択しobjectます。collectionproperty

        ObservableCollection<Test> collection = new ObservableCollection<Test>();
        collection.Add(new Test() { Id =1, Name ="Nestor"});
        collection.Add(new Test() { Id = 2, Name = "Rohan" });
        collection.Add(new Test() { Id = 3, Name = "Guy" });
        collection.Add(new Test() { Id = 4, Name = "Mike" });

        string s = "Rohan";
        var temp = collection.FirstOrDefault(x =>
            {
                if (x.Name != null)
                {
                    return x.Name.ToString().Equals(s);
                }
                else
                {
                    return x.Name;
                }
            });

このコード スニペットで次のエラーが発生しました。

エラー:

エラー 1 ラムダ式をデリゲート型 'System.Func' に変換できません。これは、ブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないためです C:\Users\vadiveln\documents\visual studio 2010\Projects\WindowsFormsApplication12\WindowsFormsApplication12 \Program.cs 36 25 WindowsFormsApplication12 エラー 2 タイプ 'string' を 'bool' に暗黙的に変換できません C:\Users\vadiveln\documents\visual studio 2010\Projects\WindowsFormsApplication12\WindowsFormsApplication12\Program.cs 36 32 WindowsFormsApplication12

これを調べて、 の正しい方法を使用するための提案を提供してくださいLinq query。前もって感謝します。

以下の変更されたコード:

        ObservableCollection<Test> collection = new ObservableCollection<Test>();
        collection.Add(new Test() { Id = 1 });
        collection.Add(new Test() { Id = 2, Name = "Rohan" });
        collection.Add(new Test() { Id = 3, Name = "Guy" });
        collection.Add(new Test() { Id = 4, Name = "Mike" });

        string s = "Rohan";
        var temp = collection.FirstOrDefault(x =>
        {
            return x.Name.Equals(s);               

        });

基になるコレクションで null フィールドを使用しました。次に、linq クエリの使用方法

4

6 に答える 6

1

戻り値の型が異なります。

if (x.Name != null)
{
    return x.Name.ToString().Equals(s); // returns bool
}
else
{
    return x.Name; // returns string (or null)
}

おそらく必要なのは次のとおりです。

collection.FirstOrDefault(x => x == s);
于 2013-06-20T15:02:16.817 に答える
1

それは同じくらい簡単なはずですvar temp = collection.FirstOrDefault(x => x.Name == s);

于 2013-06-20T14:55:43.963 に答える
0

渡すラムダ式FirstOrDefaultはブール値を返す必要があります。これを試して:

string s = "Rohan";
var temp = collection.FirstOrDefault(x => (x.Name != null) &&
                                          (x.Name.Equals(s)));

またはもっと簡単に:

var temp = collection.FirstOrDefault(x => x.Name == s);

FirstOrDefault条件に一致するアイテムが見つからない場合は null を返す可能性があるため、使用する前に null 値を確認することをお勧めしますtemp

if (temp == null)
{
    // not found...
}
于 2013-06-20T14:55:54.960 に答える
0

に等しい名前を持つ最初のアイテムを取得しようとしているようですRohan:

// Name is string, you don't need to call ToString() for comparison
var temp = collection.FirstOrDefault(x => x.Name == s);

現在のクエリの何が問題になっていますか? FirstOrDefaultメソッドには、ブール値の結果を返す述語パラメーターが必要です。x.Nameしかし、現在、述語から文字列を返そうとしています。

var temp = collection.FirstOrDefault(x =>
    {
        if (x.Name != null)
        {
            // this is OK, you are returning boolean                
            return x.Name.ToString().Equals(s);
        }
        else
        {
            // instead of return x.Name which is string
            return false;
        }
    });

コレクションの一部のオブジェクトはNameと等しいプロパティを持つ可能性があるため、変更されたコードはエラーをスローしますnull。電話をかけようとするとnull.Equals(s)NullReferenceException. これを修正するには、単純に 2 つの文字列を比較します。

   var temp = collection.FirstOrDefault(x => 
              {
                  //return x.Name.Equals(s);
                  return x.Name == s; // will not throw if name is null
              });
于 2013-06-20T14:56:14.737 に答える
0

あなたが何を達成しようとしているのかわかりませんが、あなたは完全に間違っています:)

var temp = collection.FirstOrDefault(x =>
    {
        if (x.Name != null)
        {
            // this part returns bool
            return x.Name.ToString().Equals(s);
        }
        else
        {
            // this one returns string
            return x.Name;
        }
    });

ここでは本当にシンプルなものを探していると思いますFirstOrDefault(x => x == s);

于 2013-06-20T14:56:14.920 に答える
0

FirstOrDefault は、コレクション内のすべての要素に対して TRUE または FALSE を返すデリゲートを受け取ります。

x.NameELSE 内で次と比較する必要がありますs

return x.Name.Equals(s);

、 だけでなく

 return x.Name;
于 2013-06-20T14:57:13.107 に答える