【问题标题】:Linq Any returns true despite all values in the collection being false尽管集合中的所有值都为 false,Linq Any 返回 true
【发布时间】:2017-02-16 07:19:13
【问题描述】:

我在属性值计算中看到了非常奇怪的行为。 我有一个属性 HasChanged,如果它的任何从属属性为真,则该属性为真。 但我得到了一个结果——所有的论点都是假的,结果是真的。 我正在使用 MVVM Light 框架,每个属性都是 INotifyPropertyChanged

这里是辅助函数

    private static bool PropertyWrapper(bool value, [CallerMemberName] string callerName = "")
    {
        Logger.Debug($"[{callerName}: {value}]");
        return value;
    }

    private static T PropertyWrapper<T>(Expression<Func<T>> property)
    {
        var compiled = property.Compile();
        var result = (T)compiled.DynamicInvoke();
        Logger.Debug($"[{GetName(property)}: {result}]");
        return result;
    }

    private static string GetName<T>(Expression<Func<T>> expr)
    {
        var mexpr = expr.Body as MemberExpression;
        if (mexpr == null) return "(null)";
        if (mexpr.Member == null) return "((null))";
        return mexpr.Member.Name;
    }

这是代码

    public virtual bool HasChanged => PropertyWrapper(new[] {
        PropertyWrapper(() => TitleChanged),
        PropertyWrapper(() => EnglishTitleChanged),
        PropertyWrapper(() => OriginalTitleChanged),
        PropertyWrapper(() => PlotChanged),
        PropertyWrapper(() => OutlineChanged),
        PropertyWrapper(() => DirectorChanged),
        PropertyWrapper(() => YearChanged),
        PropertyWrapper(() => MovieRolesChanged),
        PropertyWrapper(() => GenresChanged),
        PropertyWrapper(() => CountriesChanged)
    }.Any(), "HasChanged");

    public bool YearChanged => this.state == State.Edit && this.source.MovieDescription.Year != this.clone.MovieDescription.Year;
    public bool TitleChanged => HasTitleChanges();
    public bool EnglishTitleChanged => HasEnglishTitleChanges();
    public bool OriginalTitleChanged => HasOriginalTitleChanges();
    public bool PlotChanged => HasDescriptionChanges();
    public bool DirectorChanged => HasDirectorChanges();
    public bool OutlineChanged => HasOutlineChanges();
    public bool MovieRolesChanged => HasMovieRolesChanges();
    public bool CountriesChanged => HasCountriesChanges();
    public bool GenresChanged => HasGenresChanges();

以及写入日志的内容

[TitleChanged: False]

[EnglishTitleChanged: False]

[OriginalTitleChanged: False]

[情节改变:假]

[大纲改变:假]

[DirectorChanged: False]

[YearChanged: False]

[MovieRolesChanged: False]

[流派改变:假]

[CountriesChanged: False]

[已更改:真]

看起来不可能沉闷,但我无法想象它怎么会这样。 请解释一下这种行为的原因。

【问题讨论】:

    标签: c# linq any


    【解决方案1】:

    Any 如果集合中有任何元素,则不带参数返回。要得到你想要的,你必须检查你的元素的值作为你的 Any 谓词:

    public virtual bool HasChanged => PropertyWrapper(new[] {
           //...
           }.Any(q => q), "HasChanged");
    

    【讨论】:

    • 总体正确,但元素是布尔值,不是委托,所以应该是.Any(q =&gt; q)
    • @IvanStoev,谢谢,已编辑。我对那里的这么多 lambdas 感到困惑 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2016-03-05
    • 2015-02-22
    • 2020-08-04
    相关资源
    最近更新 更多