我有一个小结构,我必须比较这些值以找出哪些具有相同的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文本完全相同
答案 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。