Questions
というクラスがあります。このQuestions
にはプロパティQuestionID
とQuestionAnswer
があります。 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
私はあなたがこのようなものを探していると思います。少し時間があれば、VBに翻訳しますが、フォローできると思います。
if (_mQuestions.Any(q => q.QuestionID == 12))
{
Question question14 = _mQuestions.FirstOrDefault(q => q.QuestionID == 14);
if (question14 != null)
question14.QuestionAnswer = "Some Text";
}
残念ながら、データ構造(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 [])はどちらも一定時間で実行されることに注意してください。
念のために言っておきますが、私の見解は他のサンプルよりも少し言葉が多いですが、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
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";
}