web-dev-qa-db-ja.com

LINQを使用して、リストから特定のプロパティ値を持つオブジェクトを見つけるにはどうすればよいですか?

Questionsというクラスがあります。このQuestionsにはプロパティQuestionIDQuestionAnswerがあります。 foreachでこのList of Questionを繰り返し処理しているときに、.QuestionID = 12を見つける必要があります。 .QuestionID = 12が見つかった場合は、すぐに.QuestionAnswer = "SomeText".QuestionID = 14に値を割り当てる必要があります。

.QuestionId = 12' to find。QuestionID = 14`内で再度反復する必要はありません。

LINQを使用して.QuestionID = 14に直接移動する方法はありますか?.

例えば:

For Each mQuestion As Question In _mQuestions
    If mQuestion.QuestionId = 12 Then
         'Find mQuestion.QuestionID= 14 and insert Somtext to 
          'mQuestion.QuestionAnswer="SomeText"
    End IF
Next
19
James123

私はあなたがこのようなものを探していると思います。少し時間があれば、VBに翻訳しますが、フォローできると思います。

if (_mQuestions.Any(q => q.QuestionID == 12)) 
{
   Question question14 = _mQuestions.FirstOrDefault(q => q.QuestionID == 14);
   if (question14 != null)
       question14.QuestionAnswer = "Some Text";
}
21
Anthony Pegram

残念ながら、データ構造(List)では、Question-14が見つかったら、もう一度検索してQuestion-12を見つける必要があります。 QuestionリストがIDで並べ替えられている場合、いくつかの改善を行うことができますが、一般に、ListまたはArrayの要素に直接アクセスする方法はありません。要素のプロパティの値のみを知っています。

問題に適用できるデータ構造はDictionaryです。これにより、何らかの値を介してオブジェクトにインデックスを付けることができ、コレクション全体を反復処理することなく、それらのオブジェクトに効率的に直接アクセスできます。

ToDictionary() 拡張メソッドを呼び出すことにより、Linqを使用してリストを辞書に変換できます。

IDictionary<Question> questions = _mQuestions.ToDictionary(q => q.id);

これは、QuestionオブジェクトのIDをキーとして使用し、オブジェクトを値として使用します。次に、コードで次のことを実行できます。

if (questions.ContainsKey(12) && questions.ContainsKey(14))
{
    questions[14].QuestionAnswer = "Some Text";
}

ContainsKeyとインデクサー(operator [])はどちらも一定時間で実行されることに注意してください。

1
Steve Guidi

念のために言っておきますが、私の見解は他のサンプルよりも少し言葉が多いですが、LINQだけでそれを行うことができました。 (以下のCスタイルのコメントに注意してください!)

Private Shared Sub Main(args As String())
    Dim questions As List(Of Question) = GetQuestions()
    Dim question As Question = ( _
        Where q.ID = 14 AndAlso _
              questions.Exists(Function(p) p.ID = 12)).FirstOrDefault()
    If question IsNot Nothing Then
        question.Answer = "Some Text"
    End If
End Sub



 // Build the collection of questions! We keep this simple.
Private Shared Function GetQuestions() As List(Of Question)
    Dim questions As New List(Of Question)()
    questions.Add(New Question(12, "foo"))
    questions.Add(New Question(14, "bar"))
    Return questions
End Function

// You've already got this class. This one is just my version.
Public Class Question
    Public Sub New(id As Integer, answer As String)
        Me.ID = id
        Me.Answer = answer
    End Sub
    Public Property ID() As Integer
        Get
            Return m_ID
        End Get
        Set
            m_ID = Value
        End Set
    End Property
    Private m_ID As Integer
    Public Property Answer() As String
        Get
            Return m_Answer
        End Get
        Set
            m_Answer = Value
        End Set
    End Property
    Private m_Answer As String
End Class
0
Mike Hofer

LINQの使用:

var listOfQ = new List<Question>();

// populate the list of Question somehow...

var q14 = listOfQ.FirstOrDefault(q => q.QuestionID == 14);
if (listOfQ.Any(q => q.QuestionID == 12) && q14 != null)
{
    q14.QuestionAnswer = "SomeText";
}
0
code4life