2010-10-08 41 views
13

Tôi có một lớp được gọi là Questions. Điều này Questions có các thuộc tính QuestionIDQuestionAnswer. Trong khi lặp qua số List of Question này trong foreach, tôi phải tìm .QuestionID = 12. Nếu tôi tìm thấy .QuestionID = 12 thì tôi phải gán ngay một giá trị cho .QuestionAnswer = "SomeText" của .QuestionID = 14.Sử dụng LINQ, làm cách nào để tìm đối tượng có giá trị thuộc tính đã cho từ Danh sách?

Tôi không muốn lặp lại lần nữa bên trong .QuestionId = 12' to find .QuestionID = 14` một lần nữa.

Có cách nào để tôi có thể truy cập trực tiếp vào .QuestionID = 14 bằng LINQ ?.

Ví dụ:

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 
+1

Để rõ ràng, tôi tin rằng câu hỏi này được yêu cầu cho một cơ chế mà tránh viết một cách rõ ràng khác 'loop foreach' trong vòng câu lệnh 'if', không loại trừ hoàn toàn vòng lặp. Tất cả các câu trả lời được đưa ra liên quan đến 'Bất kỳ()' và 'FirstOrDefault()' có hiệu quả ẩn 'foreach' thứ hai này trong việc thực hiện tương ứng của chúng. –

Trả lời

17

Tôi nghĩ rằng bạn đang tìm kiếm một cái gì đó như thế này. Nếu tôi có thời gian, tôi sẽ dịch nó sang VB, nhưng tôi nghĩ bạn có thể làm theo.

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

Xin vui lòng không khuyến khích mọi người bằng cách dịch mã hoàn toàn tốt để VB. :) –

+6

ROFL. Tôi * ghét * VB – 5arx

+3

Có thể tệ hơn, tôi chỉ nhìn chằm chằm vào một ứng dụng VB.net được mã hóa gần đây được viết bằng thành ngữ VB6.

1

Thật không may, cấu trúc dữ liệu của bạn (List) đòi hỏi bạn phải tìm kiếm một lần nữa để tìm Question-14 lần Question-12 được tìm thấy. Nếu danh sách Question của bạn được sắp xếp theo ID, thì có thể thực hiện một số cải tiến, nhưng nói chung, không có cách nào để truy cập trực tiếp vào phần tử List hoặc Array chỉ bằng cách biết giá trị của thuộc tính của phần tử.

Cấu trúc dữ liệu áp dụng cho vấn đề của bạn là Dictionary vì nó cho phép lập chỉ mục đối tượng thông qua một số giá trị, cũng như truy cập trực tiếp hiệu quả vào các đối tượng đó mà không cần phải lặp lại toàn bộ bộ sưu tập.

Bạn có thể bí mật danh sách của bạn để một cuốn từ điển sử dụng LINQ bằng cách gọi phương pháp ToDictionary() mở rộng:

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

này sử dụng ID của đối tượng Question như chìa khóa, và các đối tượng như các giá trị. Sau đó, trong mã của bạn, bạn có thể làm như sau:

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

Lưu ý rằng ContainsKey và indexer (operator []) đều thực hiện trong thời gian liên tục.

+0

Giải pháp tuyệt vời! Lưu ý rằng bạn phải đảm bảo rằng ID đó là duy nhất trong trường hợp này hoặc.ToDictionary() sẽ thất bại. –

0

Quan tâm đến bạn, việc tôi thực hiện nó hơi phức tạp hơn các mẫu khác, nhưng tôi đã xoay xở để làm điều đó không có gì ngoài LINQ. (Coi chừng các ý kiến ​​C-phong cách dưới đây!)

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

Sử dụng 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"; 
} 
Các vấn đề liên quan