C#LINQ加入对象模型集合,然后按属性过滤

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

我一直在尝试编写LINQ语句,该语句将比较来自相同类型对象模型的两个集合的属性,并生成仅OnOff属性不同的那些的第三集合。我现在只使用LINQ大约一个星期,所以我仍然很习惯。

我的理解是联接将合并两个集合,并丢弃其中完全相同的任何项目,因此您没有重复项。

我得到了尝试使用Join的建议,但距离越来越近,但我还没到那里。

我的模型具有名称,OnOff,颜色等的字符串属性。我试图按名称匹配集合中的模型,然后给我一个OnOff属性不同的模型。

写出我需要的是,对于LayerModel中的每个SourceDrawingLayers,查看LayerModel中的每个TargetDrawingLayers,看看是否找到与Name匹配的一个。如果这样做,请检查OnOff属性。如果它等于[[NOT,则将其Add到OnOffConflictLayers集合。

我已经尝试使用嵌套的foreach语句和from x from和LINQ查询来执行此操作,但是我得到了大量重复项。那是向我建议Join的时候。我只需要帮助将它带回家。

到目前为止,我有这个:

var onOffQuery = from source in SourceDrawingLayers join target in TargetDrawingLayers on source.Name equals target.Name //give me every target where target.OnOff does not equal source.OnOff select new { target.OnOff }; //I don't know if I need this line it's just where I'm stuck at right now.

完成后,我必须用结果填充集合:

ObservableCollection<LayerModel> q = new ObservableCollection<LayerModel>(onOffQuery); OnOffConflictLayers = q;

我将非常感谢您尝试运行的此查询(可能非常简单)的帮助。谢谢!

更新:请参阅下面的编辑。

private void GetOnOffConflicts() { DataAccess da = new DataAccess(); if (TargetDrawingLayers != null && TargetDrawingLayers.Count != 0) { TargetDrawingLayers.Clear(); } if (OnOffConflictLayers != null && OnOffConflictLayers.Count != 0) { AllConflictLayers.Clear(); } foreach (TargetDrawingModel targetDrawingModel in TargetDrawings) { foreach (var result in da.GetDrawingLayers(targetDrawingModel.DrawingPath)) { TargetDrawingLayers.Add(result); //everything works fine up to here. My collection is populated correctly. } } var onOffQuery = from source in SourceDrawingLayers from target in TargetDrawingLayers where source.Name == target.Name && source.OnOff != target.OnOff select target; ObservableCollection<LayerModel> q = new ObservableCollection<LayerModel>(onOffQuery); OnOffConflictLayers = q; }

编辑:Matt U下面的答案是正确的。我错误地没有正确设置目标图形,并且所有的开/关属性实际上都是相同的,所以难怪我的代码什么也没返回。

将马特的答案标记为正确。

c# wpf linq observablecollection
1个回答
1
投票
© www.soinside.com 2019 - 2024. All rights reserved.