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));
}
}