C# 如何比较两个结构列表?

C# 如何比较两个结构列表?,c#,winforms,struct,C#,Winforms,Struct,我有一个小结构,我必须比较这些值,找出哪些值具有相同的FreeFlow文本,然后获取该结构枚举 public struct Holder { public string FreeFlow; public int ENumber; } 下面是我如何添加它们的 foreach(Class1.TextElement re in Class1._TextElements) { //create

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

   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文本完全相同

您所说的“比较”是什么意思?这可能意味着很多事情。您想知道这两个集合共有哪些项吗?你想知道哪些项目是不同的吗

不管你的意思是什么,林克都可能有答案。Union、Except等。

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

Class1._TextElements.SequenceEqual(Class1._TextElements2);

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

如果我的解释正确,则您希望找到lstHolder和lstHolder2中的元素,这是交点。如果我的解释正确,那么有两步解决方案:首先,在Holder结构上重写Equals()。然后使用LINQ intersect运算符:

var result = lstHolder.Intersect(lstHolder2);
我必须比较这些值才能找到 哪些具有相同的自由流 文本,然后抓取该结构 伯爵

如果可以使用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
可能不同,否则基于此确定等价性是有意义的。如果是这种情况,那么上面的
连接
查询应该是您所需要的。

首先,您应该将其设置为类而不是结构。正确地实现一个结构比正确地实现一个类要复杂得多。我想知道集合之间的freeflow文本是相同的,然后获取每个结构的两个数字