我一直在尝试编写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下面的答案是正确的。我错误地没有正确设置目标图形,并且所有的开/关属性实际上都是相同的,所以难怪我的代码什么也没返回。将马特的答案标记为正确。