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);
        }
    }
}