【发布时间】:2019-12-18 04:38:58
【问题描述】:
我正在比较LayerModel 中的两个ObservableCollections,称为SourceDrawingLayers 和TargetDrawingLayers。
LayerModel 具有如下属性:
public string Path { get; set; }
public string Name { get; set; }
//etc
程序要求用户选择我称之为TargetDrawings 的.dwg 文件。对于每一个,我都会从该文件中捕获图层以及这些图层的属性。图中的每一层都返回一个LayerModel,LayerModel 上的属性,例如PathNameColor 等,都是通过查看我正在阅读的实际绘图文件来填充的。所有LayerModels 都添加到TargetDrawingLayers。
所以TargetDrawingLayers 将包含一大堆LayerModels,我使用Path 属性来了解给定图层存在于哪个实际绘图文件中。
SourceDrawingLayers 是通过读取单个绘图文件、读取其中的所有图层并将它们添加到集合中来填充的。
我的期望是每个TargetDrawing 都将包含与SourceDrawing 具有相同设置的相同层,因此我首先将SourceDrawingLayers 中的LayerModel 的名称与@987654345 中的LayerModel 匹配来实现这一点@。
然而,应用程序的一个要求是,我需要在 SourceDrawingLayers 中识别出任何 Name 属性在 TargetDrawingLayers 中找不到的 Name。
我通过以下查询完成此操作:
var missingLayerQuery = SourceDrawingLayers.Where(p => !TargetDrawingLayers.Any(p2 => p2.Name == p.Name));
ObservableCollection<LayerModel> q = new ObservableCollection<LayerModel>(missingLayerQuery);
结果绑定到DataGrid,我需要在其上显示我的查询完成的缺失层的名称,但是因为查询结果是来自源的LayerModels 的集合,我的路径列只是显示源绘图的路径,所以我的结果将如下所示:
Drawing Path Layer Name
Awesome_Source_Drawing.dwg MissingLayerName1
Awesome_Source_Drawing.dwg MissingLayerName2
Awesome_Source_Drawing.dwg MissingLayerName3
这最终不是那么有用,因为用户不知道实际上缺少什么绘图需要存在的图层。我想要的结果是这样的:
Drawing Path Layer Name
Test_Drawing_1.dwg MissingLayerName1
Test_Drawing_2.dwg MissingLayerName2
Test_Drawing_3.dwg MissingLayerName3
我的想法是向我的LayerModel 添加一个名为public string MissingLayer {get; set;} 的属性,然后通过查看特定的TargetDrawingLayers LayerModel 并以这种方式设置值,找到一种从LINQ 查询中填充它的方法。
但这就是我被卡住的地方,因为我对 LINQ 还不够熟悉,无法完成它。我也不确定是否有更好/更简单的方法来解决它。所以我的问题是,我怎样才能使用这个 LINQ 查询来实现我想要的结果,如果我不能,有什么好方法呢?
谢谢。
【问题讨论】:
-
有一个叫
except的linq api。请看这个帖子。stackoverflow.com/questions/11957685/… -
谢谢 Jagadeesh 我也会检查这些答案。
-
Test_Drawing_1.dwg来自哪里?你能举一个SourceDrawingLayers和TargetDrawingLayers的例子吗? -
如果不想显示源绘图的路径,你想显示什么路径呢?它来自哪里?
-
@fenixil,我会用更多信息更新我的问题。谢谢。