gpt4 book ai didi

c# - `Where` 子句返回空列表,即使逻辑测试是 `true`

转载 作者:太空宇宙 更新时间:2023-11-03 23:03:34 24 4
gpt4 key购买 nike

我需要显示满足某些条件的项目。

public BindableCollection<BaseTreeItemViewModel> TreeItems
{
get
{
if (_logicTest)
return (BindableCollection<BaseTreeItemViewModel>)_treeItems.Where(n => _logicTest);
else
return _treeItems;
}
set
{
_treeItems = value;
NotifyOfPropertyChange(() => TreeItems);
}
}

事实上在Where子句中会有不同的测试(n.Header == "ABC"),但即使是_logicTest,我们知道在使用 Where 启动该行时,它是 true

_treeItems 包含大约 20 个元素,对于 _logicTest=false,它们全部返回。另一方面,_logicTest=true 函数返回空集合。

错在哪里?

在此先感谢您的帮助。

编辑

作为@Robert.S suggested ,我用过:

return new BindableCollection<BaseTreeItemViewModel>(_treeItems.Where(n => _logicTest));

它奏效了。谢谢。

最佳答案

什么是 _logicTest ?属性(property)?如果是这样,它可能会在评估集合时发生变化。此外 Where 的返回值是一个 IEnumerable<T> .仅当您使用集合(例如在 foreach 循环中)时才会评估实际值。

你可以尝试添加一个ToList()ToArray()Where 的末尾.通过这种方式立即评估集合,您可以在执行 getter 的时间点查看是否真的没有项目。

另一个选项是 VS 调试器。在监视表中,您可以使用小刷新图标评估集合。这样您也可以看到“真实”的项目。

但是如果您稍后使用该集合(例如在 foreach 循环中)和 _logicTest不再为真,集合可能为空。

这是一个简单的例子:

class Program
{
static bool _logicTest = false;
static int[] items = new int[] { 1, 2, 3 };

static void Main(string[] args)
{
_logicTest = true;

var foo = items.Where(n => _logicTest);

_logicTest = false;

Console.WriteLine(foo.Count());

_logicTest = true;

Console.WriteLine(foo.Count());
}
}

输出将是:03

在上面的例子中Count()将评估集合以确定其大小。可以看到_logicTest的值在这一刻而不是在 Where 时被评估被调用了。

您的情况可能的解决方法是局部变量:

get
{
bool logicTest = _logicTest;

if (logicTest)
return (BindableCollection<BaseTreeItemViewModel>)_treeItems.Where(n => logicTest);
else
return _treeItems;
}

局部变量不会改变。但是您应该将属性值存储在另一个变量中。因为如果您在 _logicTest 时访问该属性是假的,你当然会遇到同样的问题。

下面是上面的示例和解决方法:

class Program
{
static bool _logicTest = false;
static int[] items = new int[] { 1, 2, 3 };

static void Main(string[] args)
{
_logicTest = true;

var foo = items.Where(n => _logicTest);
var bar = Items;

_logicTest = false;

Console.WriteLine(foo.Count());
Console.WriteLine(bar.Count());

_logicTest = true;

Console.WriteLine(foo.Count());
Console.WriteLine(bar.Count());
}

static IEnumerable<int> Items
{
get
{
bool logicTest = _logicTest;

return items.Where(n => logicTest);
}
}
}

输出是0 3 3 3

关于c# - `Where` 子句返回空列表,即使逻辑测试是 `true`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42156434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com