我有以下课程。
public class ClassA
{
public int Id { get; set; }
public string data { get; set; }
public string value { get; set; }
}
public class ClassB
{
public int Id { get; set; }
public string data { get; set; }
public string value { get; set; }
}
public class ClassC
{
public void ProcessData(List<ClassA> clsA , List<ClassB> clsB)
{
// what???
}
}
列表A中的值:
列表B中的值:
我想将列表A与列表B进行比较。 即:从列表A中获取数据,其数据属性与B中相同。
使用join或contains我可以获得4个值,但是我只能从列表A中获得3个值,因为顺序也是可以修改的,意味着列表B中的3个值必须在列表A中的顺序相同。
因此,列表A中的Id = 6将不予考虑..
请帮助!!!
编辑:
它还应该与ListA中的以下数据一起使用。列表B如上所述。
请参阅更新的问题。
答案 0 :(得分:1)
您似乎正在尝试在第一个序列中找到第二个序列的子序列。最简单的方法是简单地完成整个第一个序列,采用第二个序列大小的子序列,看看它们是否匹配。
public static IEnumerable<T1> FindSubsequence<T1, T2>(
this IList<T1> first,
IList<T2> second,
Func<T1, T2, bool> matchPredicate)
{
for (int i = 0; i < first.Count - 1; i++)
{
var subsequence = first.Skip(i).Take(second.Count);
if (subsequence.Zip(second, matchPredicate).All(x => x))
return subsequence;
}
return Enumerable.Empty<T1>();
}
答案 1 :(得分:-1)
我们还有什么理由不能按价值进行比较?这对我有用:
static public void ProcessData(List<ClassA> clsA, List<ClassB> clsB)
{
var newlist = (from a in clsA
from b in clsB
where a.data == b.data && a.value == b.value
select a).ToList();
}
答案 2 :(得分:-1)
除了Hogan建议的内容之外,如果您需要结果作为其中一个类的列表,即ClassA或ClassB,那么您需要执行以下操作:
var result = clsA.Zip(clsB, (a, b) => (a.Id == b.Id && a.Data == b.Data) ? a : b as object);
请注意,您需要将另一个类转换为对象,因为三元运算符不会对不同类型的输出进行操作。
在这里,您将获得ClassA列表作为输出。