使用LINQ比较这两个列表 公共类MyClass { 公共int密钥{get;set;} 公共字符串fld{get;set;} 公共MyClass(整型键,字符串fld) { this.key=key; this.fld=fld; } } 公共类MyTest() { MyClass a=新的MyClass(1,“苹果”); MyClass b=新MyClass(2,“桃子”); MyClass c=新MyClass(3,“香蕉”); MyClass d=新的MyClass(2,“橙色”); MyClass e=新MyClass(4,“pear”); List myList1=新列表(); myList1.添加(a); 1.加入(b); 1.加入(e); List myList2=新列表(); myList2.添加(a); 第2条增补(d); 2.加入(c); }
我想在xml输出中比较myList1和myList2。 在这种情况下,两个列表具有相同的键1。不需要输出这个。 键2 fld不同。因此,记录第一个列表fld值。 第一个列表没有键3,换句话说,我们可以认为它已从列表1中删除。因此,记录键3并清空fld。第一个列表有键4,而第二个列表没有。所以把它记在日志里。 因此,预期产出为:使用LINQ比较这两个列表 公共类MyClass { 公共int密钥{get;set;} 公共字符串fld{get;set;} 公共MyClass(整型键,字符串fld) { this.key=key; this.fld=fld; } } 公共类MyTest() { MyClass a=新的MyClass(1,“苹果”); MyClass b=新MyClass(2,“桃子”); MyClass c=新MyClass(3,“香蕉”); MyClass d=新的MyClass(2,“橙色”); MyClass e=新MyClass(4,“pear”); List myList1=新列表(); myList1.添加(a); 1.加入(b); 1.加入(e); List myList2=新列表(); myList2.添加(a); 第2条增补(d); 2.加入(c); },linq,Linq,我想在xml输出中比较myList1和myList2。 在这种情况下,两个列表具有相同的键1。不需要输出这个。 键2 fld不同。因此,记录第一个列表fld值。 第一个列表没有键3,换句话说,我们可以认为它已从列表1中删除。因此,记录键3并清空fld。第一个列表有键4,而第二个列表没有。所以把它记在日志里。 因此,预期产出为: public class MyClass { public int key { get; set; } public string fld
public class MyClass
{
public int key { get; set; }
public string fld { get; set; }
public MyClass(int key, string fld)
{
this.key = key;
this.fld = fld;
}
}
public class MyTest()
{
MyClass a = new MyClass(1, "apple");
MyClass b = new MyClass(2, "peach");
MyClass c = new MyClass(3, "banana");
MyClass d = new MyClass(2, "orange");
MyClass e = new MyClass(4, "pear");
List<MyClass> myList1 = new List<MyClass>();
myList1.Add(a);
myList1.Add(b);
myList1.Add(e);
List<MyClass> myList2 = new List<MyClass>();
myList2.Add(a);
myList2.Add(d);
myList2.Add(c);
}
2.
桃
3.
4.
梨
有谁能解释一下如何在LINQ中实现它吗?如果我理解正确,您希望将列表A和B与3组结果进行比较:
- 两个列表中具有相同ID但“值”不同的项
- 列表A中但不在列表B中的项目
- 列表B中但不在列表A中的项目
<lists>
<list>
<key>2</key>
<fld>peach</fld>
</list>
<list>
<key>3</key>
<fld></fld>
</list>
<list>
<key>4</key>
<fld>pear</fld>
</list>
<lists>
通过创建IEqualityProvider
,您可以简化一些事情,但是除非您有重大的性能问题(或者经常执行这些类型的查询),否则这可能不值得
请注意,如果使用字典而不是自定义类型的列表,查询速度会更快
Linq用于查询,而不是创建XML 我在上面的评论中指出,我可能会选择使用与Linq不同的方法,因为需要处理不匹配的键和不匹配的值,同时完全忽略所有对齐的记录。我认为在字典上使用标准循环可以表达您的意图
var differentValues = from a in myList1
join b in myList2 on a.key = b.key
where a.fld != b.fld
select a;
var missingKeysFrom1 = myList2.Where(b => !myList1.Any(a => a.key == b.key));
var missingKeysFrom2 = myList1.Where(b => !myList2.Any(a => a.key == b.key));
这似乎可以解决概述的问题。它将您的第一个列表加载到字典中,然后针对第二个列表循环以查找差异,并有条件地添加带有空字段的新键,以匹配您的规范。如果我们在事实之后将此词典投影到XML
var itemDictionary = myList1.ToDictionary(item => item.key, item => item.fld);
foreach (var item in myList2)
{
if (itemDictionary.ContainsKey(item.key))
{
if (itemDictionary[item.key].Equals(item.fld))
itemDictionary.Remove(item.key);
}
else
{
itemDictionary.Add(item.key, string.Empty);
}
}
…我们得到以下输出,它似乎也符合您的规范(当查看您的注释时,顺序无关紧要)
3.
2.
桃
4.
梨
订购是否重要?这些听起来基本上像是字典
对象,真的。。。它们是吗?您停留在哪一部分,XML序列化的查询部分?想想在Linq之外您将如何做到这一点。如果这个想法可以表示为一系列过滤器、连接和投影,那么Linq可能会很有用。就我个人而言,我不认为Linq一定是这个特定任务的正确工具,尽管有人可能会让我大吃一惊。我想到了另一种解决方案,即使用字典查找匹配的键,删除具有匹配值的键,然后最后添加不匹配的键,这可以非常干净地完成。Jon,不,顺序不重要。Stanley,是的,你理解我的意思。我被困在查询部分。“Linq用于查询,而不是创建XML。”然而,XML输出只是一个投影问题,就像其他任何问题一样。
var xml = new XElement("lists",
(from pair in itemDictionary
select new XElement("list",
new XElement("key", pair.Key),
new XElement("fld", pair.Value))
).ToArray()
);
<lists>
<list>
<key>3</key>
<fld></fld>
</list>
<list>
<key>2</key>
<fld>peach</fld>
</list>
<list>
<key>4</key>
<fld>pear</fld>
</list>
</lists>