2012-11-05 49 views

Trả lời

35

Thứ nhất, Single ném một ngoại lệ nếu có nhiều hơn một yếu tố đáp ứng các tiêu chí. Thứ hai, tiêu chí của bạn chỉ nên kiểm tra xem tài sản Correcttrue. Ngay bây giờ, bạn đang kiểm tra xem a có bằng a.Correct (thậm chí sẽ không biên dịch) hay không.

Bạn nên sử dụng First (mà sẽ ném nếu không có các yếu tố như vậy), hoặc FirstOrDefault (mà sẽ trở null cho một loại tài liệu tham khảo nếu không có yếu tố như vậy):

// this will return the first correct answer, 
// or throw an exception if there are no correct answers 
var correct = answers.First(a => a.Correct); 

// this will return the first correct answer, 
// or null if there are no correct answers 
var correct = answers.FirstOrDefault(a => a.Correct); 

// this will return a list containing all answers which are correct, 
// or an empty list if there are no correct answers 
var allCorrect = answers.Where(a => a.Correct).ToList(); 
+1

Cảm ơn vì lời giải thích –

2

nếu a.Correct là một lá cờ bool để có câu trả lời đúng thì bạn cần.

Answer answer = Answers.Single(a => a.Correct); 
10

Tôi giả sử bạn đang nhận được ngoại lệ vì Single. Danh sách của bạn có thể có nhiều câu trả lời được đánh dấu là chính xác, đó là lý do tại sao Single sẽ ném một ngoại lệ sử dụng First hoặc FirstOrDefault();

Answer answer = Answers.FirstOrDefault(a => a.Correct); 

Ngoài ra nếu bạn muốn nhận được danh sách của tất cả các mục đánh dấu là chính xác bạn có thể thử:

List<Answer> correctedAnswers = Answers.Where(a => a.Correct).ToList(); 

Nếu kết quả mong muốn của bạn là Single, thì sai lầm bạn đang làm trong truy vấn của bạn được so sánh một mục có giá trị bool. So sánh của bạn

a == a.Correct 

sai trong tuyên bố. truy vấn duy nhất của bạn nên là:

Answer answer = Answers.Single(a => a.Correct == true); 

Hoặc ngay như:

Answer answer = Answers.Single(a => a.Correct); 
1

Tôi nghĩ rằng bạn đang tìm kiếm điều này?

var correctAnswer = Answers.First(a => a.Correct); 

Bạn có thể sử dụng duy nhất bằng cách gõ:

var correctAnswer = Answers.Single(a => a.Correct); 
1

Dĩ nhiên!

Sử dụng FirstOrDefault() để chọn đối tượng đầu tiên mà phù hợp với điều kiện:

Answer answer = Answers.FirstOrDefault(a => a.Correct); 

Nếu không sử dụng Where() để chọn một tập hợp con của danh sách của bạn:

var answers = Answers.Where(a => a.Correct); 
4

biểu hiện của bạn là không bao giờ để đánh giá.

Bạn đang so sánh a với thuộc tính a.

a thuộc loại Trả lời. a.Correct, tôi đoán là một boolean.

hình thức Long: -

Answer = answer.SingleOrDefault(a => a.Correct == true); 

hình thức viết tắt: -

Answer = answer.SingleOrDefault(a => a.Correct); 
0

Vài điều cần sửa chữa ở đây:

  1. Không ngoặc trong khai báo lớp
  2. Tận dụng "đúng "thuộc tính công khai
  3. Và sau đó thực hiện lựa chọn

Mã của bạn sẽ giống như thế này

List<Answer> answers = new List<Answer>(); 
/* test 
answers.Add(new Answer() { correct = false }); 
answers.Add(new Answer() { correct = true }); 
answers.Add(new Answer() { correct = false }); 
*/ 
Answer answer = answers.Single(a => a.correct == true); 

và lớp

class Answer 
{ 
    public bool correct; 
} 
0
Answers = Answers.GroupBy(a => a.id).Select(x => x.First()); 

này sẽ chọn từng đối tượng độc đáo qua email

Các vấn đề liên quan