Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
使用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 - Fatal编程技术网

使用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比较这两个列表 公共类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

我想在xml输出中比较myList1和myList2。 在这种情况下,两个列表具有相同的键1。不需要输出这个。 键2 fld不同。因此,记录第一个列表fld值。 第一个列表没有键3,换句话说,我们可以认为它已从列表1中删除。因此,记录键3并清空fld。第一个列表有键4,而第二个列表没有。所以把它记在日志里。 因此,预期产出为:

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>