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

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

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

我得到建议尝试使用Join来做到这一点,但我已经接近了,但我还没到那里。

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

写出我需要的,对于LayerModel中的每个SourceDrawingLayers,调查LayerModel中的每个TargetDrawingLayers,看看是否找到一个与{{1 }}。如果这样做,请检查Name属性。如果相等,则OnOff到OnOffConflictLayers集合。

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

到目前为止,我有这个:

from

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

            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;

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

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

xiaohui1007 回答:C#LINQ加入对象模型集合,然后按属性进行过滤

听起来您正在寻找所谓的非等额联接。您将使用两个join子句和一个from来代替where

var onOffQuery = from source in SourceDrawingLayers
                 from target in TargetDrawingLayers
                 where source.Name == target.Name && source.OnOff != target.OnOff
                 select target;

// onOffQuery should contain the "target" objects where there is a matching Name in source,but OnOff differs.
// You can "select source" if you want the source objects

有关非等额联接和其他自定义“联接”的更多信息:https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-custom-join-operations

本文链接:https://www.f2er.com/3004208.html

大家都在问