【问题标题】:Linq query returns no resultLinq 查询不返回结果
【发布时间】:2016-09-30 12:52:57
【问题描述】:

我正在尝试按条件(两个 Observable 集合)从列表中获取子列表。虽然这可以按预期工作 - 选择很少的结果:

ObservableCollection<TestCase> affectedTestCases =
    new ObservableCollection<TestCase>();
foreach (var testCase in TestCaseList.ListOfTestCases)
{
    if (testCase.TestHash == CurrentFile.Hash)
    {
        affectedTestCases.Add(testCase);
    }
}

其中 Hash(和 TestHash)是一个简单的字符串。这个没有显示结果,我想知道为什么:

var affectedTestCases = from testCase in TestCaseList.ListOfTestCases
where testCase.TestHash==CurrentFile.Hash
select testCase;

然后我想通过以下方式使用结果:

foreach (var affectedTestCase in affectedTestCases)

但它没有显示任何 LINQ 变体。我还尝试将 AffectedTestCases 投射到列表中。而且我还尝试使用 String.Equals() 进行比较。任何想法我做错了什么?

【问题讨论】:

  • LINQ 代码没问题(但它不等同于 foreach 一)。请在使用查询结果的地方显示更多代码。
  • 你在调试器中浏览过代码吗?您确定在第二种情况下TestCaseList.ListOfTestCases 实际上有任何东西吗?您确定该集合包含等于CurrentFile.HashTestHash 值吗?您的 LINQ 查询应该按原样工作(您不需要添加ToList)所以您的数据集一定有问题。
  • TestCaseList.ListOfTestCases 包含 4 项,其中 3 项具有与 CurrentFile.Hash 相同的 TestHash。我尝试在一个函数中运行这两条代码而不更改数据集。

标签: c# .net linq select


【解决方案1】:

试试这个:

var affectedTestCases = TestCaseList.ListOfTestCases.Where(_ => _.TestHash.Equals(CurrentFile.Hash));

【讨论】:

  • 你改变了什么?只有代码转储并没有真正的用处。
【解决方案2】:

ObservableCollection 它实现了 Collection Strange 如果它不工作,稍微修改使用 Any() 请试试这个

 var affectedTestCases = from testCase in TestCaseList.ListOfTestCases
                                 where TestCaseList.ListOfTestCases.Any(o=> o.TestHash.Contains(CurrentFile.Hash))
                                 select testCase ;

 affectedTestCases = new ObservableCollection<TestCase>(TestCaseList.Where(o => o.TestHash.Any(m => m.Equals(CurrentFile.TestHash))).Select(o => o));

【讨论】:

  • 第二个版本不起作用:CS1061:“布尔”不包含“选择”的定义,并且找不到接受“布尔”类型的第一个参数的扩展方法“选择”(你是缺少 using 指令或程序集引用?)
【解决方案3】:

我想我明白了,我尝试使用 LINQ,然后修改了 CurrentFile.Hash(LINQ 条件的一部分)。之后,受影响的TestCases 上的 foreach 没有显示任何结果。所以我用错了LINQ,因为我改变了条件。我以为它会记住结果。解决方案很简单,我可以在 LINQ 的结果上使用 ToList() 并使用这些结果。像这样的:

var affectedTestCases = (from testCase in TestCaseList.ListOfTestCases
  where testCase.TestHash==CurrentFile.Hash
  select testCase).ToList();

ScriptEditor.Save(filePath);// this changes CurrentFile.Hash

foreach (var affectedTestCase in affectedTestCases2)
{
  int index = TestCaseList.ListOfTestCases.IndexOf(affectedTestCase);
  TestCaseList.ListOfTestCases[index].TestHash = CurrentFile.Hash;
}

感谢您的帮助。不然我就想不通了。

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多