2010-09-16 129 views
1

我有一個小結構,我必須比較這些值以找出哪些具有相同的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比較,但我想這不會是最有效的方法。任何幫助?

編輯:我想,以確定是否自由流動的文字是完全一樣的其他結構自流文本

+2

首先,你應該讓它成爲一個類而不是結構。正確地實現結構比正確實現類更復雜。 – Guffa 2010-09-16 16:05:48

回答

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查詢應該是你需要的。

0

你所說的「比較」是什麼意思?這可能意味着很多事情。你想知道哪些項目是共同的兩套?你想知道哪些項目是不同的?

無論你是什麼意思,LINQ都可能有答案。聯盟,除了等

+0

我想知道什麼自由流文本是相同的集之間,然後抓住兩個數字爲每個結構 – Spooks 2010-09-16 16:18:38

0

如果您正在使用C#3.0或更高版本,然後嘗試SequenceEqual方法

Class1._TextElements.SequenceEquals(Class1._TextElements2); 

這將運行在集合中的元素平等檢查。如果序列的長度不同或者同一位置的任何元素不相等,它將返回錯誤。

+0

不使用C#3.0或更高版本在此項目:( – Spooks 2011-10-04 14:23:05

1

如果我正確地解釋了你,你想找到這兩個元素都是 lstHolder和lstHolder2--這是交集。如果我解釋正確,那麼2步解決方案:首先,覆蓋Holder結構上的Equals()。然後使用LINQ德相交操作:

var result = lstHolder.Intersect(lstHolder2);