C# `Where`子句返回空列表,即使逻辑测试为'true'`
我需要显示满足某些条件的项目C# `Where`子句返回空列表,即使逻辑测试为'true'`,c#,linq,mvvm,where,caliburn.micro,C#,Linq,Mvvm,Where,Caliburn.micro,我需要显示满足某些条件的项目 public BindableCollection<BaseTreeItemViewModel> TreeItems { get { if (_logicTest) return (BindableCollection<BaseTreeItemViewModel>)_treeItems.Where(n => _logicTest); else
public BindableCollection<BaseTreeItemViewModel> TreeItems
{
get
{
if (_logicTest)
return (BindableCollection<BaseTreeItemViewModel>)_treeItems.Where(n => _logicTest);
else
return _treeItems;
}
set
{
_treeItems = value;
NotifyOfPropertyChange(() => TreeItems);
}
}
它成功了。谢谢。什么是
\u logicTest
?财产?如果是这样,则在计算集合时可能会发生更改。此外,的返回值,其中
是一个IEnumerable
。只有在使用集合时(例如,在foreach循环中),才会计算实际值
您可以尝试在Where
的末尾添加ToList()
或ToArray()
。通过这种方式,将立即对集合进行评估,您可以看到在执行getter时是否真的没有项
另一个选项是VS调试器。在监视表中,您可以使用小的刷新图标评估集合。这样,您也可以看到“真实”项目
但是如果稍后使用集合(例如在foreach循环中),并且\u 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());
}
}
输出将是:
0
三,
在上面的示例中,Count()
将评估集合以确定其大小。您可以看到,\u logicTest
的值是在此时进行计算的,而不是在调用时进行计算的
对于您的案例,可能的解决方法是使用局部变量:
get
{
bool logicTest = _logicTest;
if (logicTest)
return (BindableCollection<BaseTreeItemViewModel>)_treeItems.Where(n => logicTest);
else
return _treeItems;
}
输出是0 3\u logicTest
是布尔变量,在求值时无法更改。”BindableCollection'继承自'IEnumerable'ToList
或ToArray
不起作用-类型转换有问题。请尝试追加Count()
然后查看它在getter中是否为0。我的问题是,即使我尝试Where(n=>true),也不起作用
。您是否检查了\u treeItems
是否为空?问题可能在于强制转换到BindableCollection
<代码>其中
返回一个IEnumerable
。这不是一个BindableCollection
。你不能直接投下它。您必须使用构造函数创建一个新集合,如newbindableCollection(…其中(…)
。
get
{
bool logicTest = _logicTest;
if (logicTest)
return (BindableCollection<BaseTreeItemViewModel>)_treeItems.Where(n => logicTest);
else
return _treeItems;
}
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);
}
}
}