通过使用LINQ和MVVM过滤两个相同类型的ObservableCollection来创建ObservableCollection

问题描述 投票:0回答:1

我正在尝试创建ObserverableCollection,以通过查看其他集合并添加目标集合中与源集合具有不同值的任何对象来填充网格视图。

我有一个模特:

public class LayerModel
{
    public string Name { get; set; }

    public string OnOff { get; set; }

    public string Freeze { get; set; }

    public string Color { get; set; }

    public string Linetype { get; set; }

    public string Lineweight { get; set; }

    public string Transparency { get; set; }

    public string Plot { get; set; }
}

以及我的视图模型中该模型的两个ObservableCollections:

public ObservableCollection<LayerModel> SourceDrawingLayers { get; set; }

public ObservableCollection<LayerModel> TargetDrawingLayers { get; set; }

冲突的集合:

public ObservableCollection<LayerModel> ConflictLayers {get; set;}

最后是要与之进行比较的目标图纸的集合:

ObservableCollection<TargetDrawingModel> TargetDrawings {get; set;}

在应用程序中,要求用户选择源图形。提示用户输入OpenFileDialog并选择图形文件。此时,SourceDrawingLayers是通过查看该文件中每个图层并创建集合的方法创建的。

接下来,用户必须选择一组目标图纸,以TargetDrawingModel表示。选择已添加到TargetDrawings

现在是有趣的部分。

我需要打开每个目标图形并阅读图层,然后将这些图层与SourceDrawingLayers进行比较,如果属性不同,则需要将其添加到ConflictLayers

到目前为止,我已经尝试了一个讨厌的三层嵌套的foreach语句,该语句无法正常工作,所以我开始研究LINQ,因为似乎可以轻松解决我的问题,但结果却很奇怪。

这是我目前所在的位置。我试图使用“ where”语句仅查看我的LayerModel内的OnOff属性,但是生成的ConflictLayers ObservableCollection只是填充了TargetDrawing内部的每一层并按原样显示其设置。

    private void PopulateConflictLayers()
    {
        foreach (TargetDrawingModel targetDrawingModel in TargetDrawings)
        {
            DataAccess da = new DataAccess();
            TargetDrawingLayers = da.GetDrawingLayers(targetDrawingModel.DrawingPath);
            ConflictLayers = TargetDrawingLayers.Where(y => SourceDrawingLayers.Any(z => z.OnOff == y.OnOff));
        }
    }

我的目标是ConflictLayersLayerModel内部TargetDrawingLayers的[[only的集合,其中any属性与SourceDrawingLayers中的内容不匹配。

[我也尝试过使用Any方法,但是得到了完全相同的结果,其中ConflictLayers仅显示了目标图形中的每个LayerModel,无论其设置如何或与SourceDrawingLayers内部的内容是否匹配。

任何想法都会得到[[极大

的赞赏!

更新:我尝试了下面的reggaeguitar提供的解决方案,结果是我的数据网格仅在添加到集合中的源图形和目标图形中显示了所有未经过滤的图层。我在LayerModel上实现了IEquatable,>

public bool Equals(LayerModel other) { if (other == null) return false; return Name == other.Name && OnOff == other.OnOff && Freeze == other.Freeze && Color == other.Color && Linetype == other.Linetype && Lineweight == other.Lineweight && Transparency == other.Transparency && Plot == other.Plot; }

并且更新了我的方法如下:

 private void PopulateConflictLayers()
    {
        foreach (TargetDrawingModel targetDrawingModel in TargetDrawings)
        {
            DataAccess da = new DataAccess();
            TargetDrawingLayers = da.GetDrawingLayers(targetDrawingModel.DrawingPath);
            var s = TargetDrawingLayers.Except(SourceDrawingLayers).Union(SourceDrawingLayers.Except(TargetDrawingLayers));
            ObservableCollection<LayerModel> list = new ObservableCollection<LayerModel>(s);
            ConflictLayers = list;
        }
    }

我做错了什么?

我正在尝试通过查看其他集合并添加目标集合中与源值具有不同值的任何对象来创建ObserverableCollection来填充网格视图的方法...] >> 

我找到了要发布的解决方案。
我最终像这样修改了我的代码:

ConflictLayers = TargetDrawingLayers.Where(i => !SourceDrawingLayers.Contains(i)).ToList();

我还在IEquatable上实现了LayerModel,并在其上也覆盖了GetHashCode()。结果是我的ConflictLayers现在正确地填充了属性不同于LayerModelsSourceDrawing

c# wpf linq observablecollection
1个回答
0
投票
我最终像这样修改了我的代码:
© www.soinside.com 2019 - 2024. All rights reserved.