繁体   English   中英

如何比较两个结构列表?

[英]How to compare two struct lists?

我有一个小结构,我必须比较这些值以找出哪些具有相同的 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 文本,然后获取该结构 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查询应该就是您所需要的。

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

var result = lstHolder.Intersect(lstHolder2);

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

无论您的意思是什么,LINQ 都可能有答案。 联合、除外等

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

Class1._TextElements.SequenceEqual(Class1._TextElements2);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM