- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要显示满足某些条件的项目。
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/
我是一名优秀的程序员,十分优秀!