2013-11-15 37 views
3

我有那些检查我是否拥有网格中所有答案的语句。每行由ContextYID标识。我可以在OneLiner中转换这两个LINQ语句吗(C#)

我想知道如果我可以结合这些LinQ查询并将其直接转换为True/False语句。

int nbRow = Answers.Where(a => a.FieldId == result.Id && a.FieldYId == fieldYAxi.Id) 
        .Select(a => a.ContextYId) 
        .Distinct() 
        .Count(); 

int nbAnswer = Answers.Count(a => 
a.FieldId == result.Id && 
a.FieldXId == fieldXAxi.Id && 
a.FieldYId == fieldYAxi.Id); 

if (nbAnswer != nbRow) 
    return false; 
else 
    return true; 
+0

如果'nbAnswer == nbRow'会发生什么?你'返回true',还是做了其他事情?你在寻找一个只是'return [something]'或'if(something)return false'的答案吗? –

+0

@TimS。是的,事实上,如果行数匹配答案的数量,则返回true – JudgeProphet

+0

如果*每行由ContextYID *标识,我想这意味着每行有一个唯一的'ContextYId',什么意思?.Select(a => a.ContextYId).Distinct()。Count()'而不是简单的'Answers.Count(a => a.FieldId == result.Id ...)'? – sloth

回答

4

我认为这是一种进步,因为FieldIdFieldYID只需要一次比较,我简化您的return语句成一行。

var matchingAnswers = Answers.Where(a => a.FieldId == result.Id 
             && a.FieldYId == fieldYAxi.Id).ToList(); 
int nbRow = matchingAnswers 
       .Select(a => a.ContextYId) 
       .Distinct() 
       .Count(); 
int nbAnswer = matchingAnswers.Count(a => a.FieldXId == fieldXAxi.Id); 
return nbAnswer == nbRow; 

如果你喜欢,你可以通过合并的最后几行缩短这个:

var matchingAnswers = Answers.Where(a => a.FieldId == result.Id 
             && a.FieldYId == fieldYAxi.Id).ToList(); 
return matchingAnswers.Count(a => a.FieldXId == fieldXAxi.Id) == 
     matchingAnswers.Select(a => a.ContextYId).Distinct().Count(); 
+0

我喜欢它,它很干净,易于阅读 – JudgeProphet

+0

它的工作很棒。发送很多! – JudgeProphet

3

不等于工作?

return Answers.Where(a => a.FieldId == result.Id && a.FieldYId == fieldYAxi.Id) 
       .Select(a => a.ContextYId) 
       .Distinct() 
       .Count() 
       .Equals(Answers.Count(a => 
         a.FieldId == result.Id && 
         a.FieldXId == fieldXAxi.Id && 
         a.FieldYId == fieldYAxi.Id)); 
+0

这就是工作! THKS。现在这是最好的答案! – JudgeProphet

+0

你应该在@TimS的回答中有一个很好的阅读,他似乎已经多了一些想法,我只是把它们混合在一起:) – JMK

0

我认为这应该工作。你有没有特别的理由要这样做?

return Answers.Where(a => a.FieldId == result.Id && a.FieldYId == fieldYAxi.Id) 
       .Select(a => a.ContextYId) 
       .Distinct() 
       .Count() 
    == Answers.Count(a => a.FieldId == result.Id 
         && a.FieldXId == fieldXAxi.Id 
         && a.FieldYId == fieldYAxi.Id) 
0

认为这是功能上等同于什么都做(但我不知道你在做什么做着满足nbAnswer多次重复ContextYIds):

var distinctContextYIds = new HashSet<int>(); 

return 0 == Answers.Where(a => a.FieldId == result.Id && a.FieldYId == fieldYAxi.Id) 
    .Aggregate(0, (tally, answer) => 
    { 
     if (distinctContextYIds.Add(answer.ContextYId)) 
      tally += 1; 

     if (answer.FieldXId == fieldXAxi.Id) 
      tally -= 1; 

     return tally; 
    }); 
相关问题