如何比较两个结构列表?

时间:2010-09-16 15:53:53

标签: c# winforms struct

我有一个小结构,我必须比较这些值以找出哪些具有相同的FreeFlow文本,然后获取该结构ENumber。

   public struct Holder
    {
        public string FreeFlow;
        public int ENumber;
    }

以下是我添加它们的方式

foreach(Class1.TextElement re in Class1._TextElements)
            {
                //create struct with all details will be good for later
                Holder ph = new Holder();
                ph.FreeFlow = re.FreeFlow;
                ph.ENumber = re.ENumber;
                lstHolder.Add(ph);
            }

      foreach(Class1.TextElement2 re in Class1._TextElements2)
            {
                //create struct with all details will be good for later
                Holder phi = new Holder();
                phi.FreeFlow = re.FreeFlow;
                phi.ENumber = re.ENumber;
                lstHolder2.Add(phi);
            }

我可以在foreach中使用foreach进行比较,但我认为这不是最有效的方法。有什么帮助吗?

编辑:我正在尝试确定freeflow文本是否与其他struct freeflow文本完全相同

4 个答案:

答案 0 :(得分:2)

  

我必须比较要查找的值   哪些具有相同的FreeFlow   文本,然后抓取该结构   ENumber。

如果您可以使用LINQ,则可以使用相同的FreeFlow文本加入项目,然后选择这两个项目的ENumber值:

var query = from x in Class1._TextElements
            join y in Class1._TextElements2 on x.FreeFlow equals y.FreeFlow
            select new { xId = x.ENumber, yId = y.ENumber };

foreach (var item in query)
{
    Console.WriteLine("{0} : {1}", item.xId, item.yId);
}

编辑:我的理解是FreeFlow文本是公共成员,ENumber可能不同,否则根据它来确定等价是有意义的。如果是这种情况,则上面的join查询应该是您所需要的。

答案 1 :(得分:1)

如果我正确地解释你,你想要找到两个 lstHolder和lstHolder2中的元素 - 这是交集。如果我正确解释,那么2步解决方案:首先,在Holder结构上重写Equals()。然后使用LINQ交叉运算符:

var result = lstHolder.Intersect(lstHolder2);

答案 2 :(得分:0)

“比较”是什么意思?这可能意味着很多事情。你想知道两套共有哪些物品?你想知道哪些项目不同吗?

无论你的意思是什么,LINQ都可能有答案。联盟,除了等等。

答案 3 :(得分:0)

如果您使用的是C#3.0或更高版本,请尝试使用SequenceEqual方法

Class1._TextElements.SequenceEquals(Class1._TextElements2);

这将对集合中的元素执行相等性检查。如果序列具有不同的长度或者相同位置中的任何元素不相等,则它将返回false。