Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在列表中查找字符串并使用linq(复杂)更改另一个属性的值_C#_Wpf_Linq_Datagrid - Fatal编程技术网

C# 在列表中查找字符串并使用linq(复杂)更改另一个属性的值

C# 在列表中查找字符串并使用linq(复杂)更改另一个属性的值,c#,wpf,linq,datagrid,C#,Wpf,Linq,Datagrid,我有两个具有公共属性的列表,我需要对它们进行比较,并相应地更改最终列表 class ClassA { public string Property1 { get; set; } public List<ClassB> LstClassB { get; set; } } class ClassB { public string PropertyToCompare { get; set; } public string Property2 { get;

我有两个具有公共属性的列表,我需要对它们进行比较,并相应地更改最终列表

class ClassA
{
    public string Property1 { get; set; }
    public List<ClassB> LstClassB { get; set; }
}

class ClassB
{
    public string PropertyToCompare { get; set; }
    public string Property2 { get; set; }
}
class ClassC
{
    public string Property { get; set; }
    public List<ClassB> LstClassB { get; set; }
}
class ClassD : ClassA
{
    public bool PropertyToChange { get; set; }
}


 void fun()
    {
        List<ClassC> LstClassC = new List<ClassC>();
        //populate LstClassC

        List<ClassD> LstClassD = new List<ClassD>();
        //populate LstClassD
        foreach (var objectC in LstClassC)
        {
            foreach (var objectBFromClassC in objectC.LstClassB)
            {
                foreach (var objectD in LstClassD)
                {
                    foreach (var objectBFromD in objectD.LstClassB)
                    {
                        if (objectBFromD.PropertyToCompare == objectBFromClassC.PropertyToCompare)
                            objectD.PropertyToChange = newValue;
                    }
                }

            }
        }
    }
这就是我想在列表中以一种有效的方式在LINQ中更改的内容,因为LstD绑定到DataGrid,因此,每次我基于相同的条件更新PropertyToChange的值时,我希望它反映在DataGrid中

您可以使用SelectMany将两个列表中的每个列表展平到子元素列表中,然后您可以基于公共属性将这两个列表连接在一起。使用Join将能够使用基于散列的查找来从每个集合中查找匹配的项,这将比查看每个组合要快得多,就像您当前迭代执行的那样

var query = from d in LstClassD
            from dChild in d.LstClassB
            join cChild in LstClassC.SelectMany(c => c.LstClassB)
            on dChild.PropertyToCompare equals cChild.PropertyToCompare
            into matches
            where matches.Any()
            select d;
foreach (var d in query)
    d.PropertyToChange = newValue;

我不能评论这有多高效,但是我会使用Linq的Intersects函数

如果您希望以下代码采用交互式格式,请转到此链接

如果您想了解有关“相交”函数的更多信息,请查看此处

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {       
        var x = new List<String>();
        x.Add("Hello");
        x.Add("Hola");
        x.Add("Aloha");

        var y = new List<String>();
        y.Add("Goodbye");
        y.Add("Adios");
        y.Add("Aloha");

        var intersects = x.Intersect(y);
        intersects.ToList().ForEach(zz=> Console.WriteLine(zz));

    }
}