2015-10-29 36 views
0

我想比較2個列表。將舊列表過濾到新列表C#

1列表具有一些GlueLines這些都是用2個屬性的對象:StartPositionEndPosition(二者PointF

列表2是空的並且需要被填充的新行。

我只想添加一個新的GlueLine,當DrawLines列表中沒有其他對象具有該特定的StartPosition.Y值時。

下面你可以找到代碼:

List<GlueLine> SortedList; 
List<GlueLine> DrawLines = new List<GlueLine>(); 

SortedList = a_listGlueLines.OrderBy(o => Math.Round(o.StartPosition.X, 2)).ToList(); 

for(int i =0; i <SortedList.Count; i++) 
{ 
    if(DrawLines.Count < 0) 
    { 
     for(int j = 0; j < DrawLines.Count; j++) 
     { 
      if(SortedList[i].StartPosition.Y != DrawLines[...].StartPosition.Y) // ... needs to be ALL of the objects in that list 
      { 
       DrawLines.Add(SortedList[i]); 
      } 
     } 
    } 
    else 
    { 
      DrawLines.Add(SortedList[i]); 
    } 
} 

還是有一些其他的方式,以1和表1個對象比較於其他列表中的所有對象?

+0

怎麼樣'去。 Any'? –

+0

'.Any'work? – Bart

+0

[文檔](https://msdn.microsoft.com/en-us/library/vstudio/bb534972(v = vs.100).aspx)是你的朋友。 – mason

回答

2

使用MoreLINQ,其具有DistinctBy方法。

IEnumerable<GlueLines> distinctLinesByY = lines.DistinctBy(line => line.Y); 

如果你不想依賴於庫,只需實現一個方法:

public static class EnumerableExtensions 
{ 
    public static IEnumerable<TSource> DistinctBy<TSource, TKey>(IEnumerable<TSource> source, 
                   Func<TSource, TKey> keySelector) 
    { 
     var knownKeys = new HashSet<TKey>(); 
     return source.Where(element => knownKeys.Add(keySelector(element))); 
    } 
} 
0

爲了有效地做到這一點,我會用一個Dictionary<Single,GlueLine>的鍵是Y座標。即改變

List<GlueLine> DrawLines = new List<GlueLine>(); 

Dictionary<Single,GlueLine> DrawLines = new Dictionary<Single,GlueLine>(); 

您可以

if (!DrawLines.ContainsKey(SortedList[i].StartPosition.Y)) 
    DrawLines.Add(SortedList[i].StartPosition.Y, SortedList[i]) 

取代你的循環中如果速度是不是一個問題,那麼你可以使用LINQ查詢選擇將不同的Y座標放入列表中,然後從中選擇第一個匹配的GlueLine。這不是非常有效,但你可能會覺得它更容易編碼/讀取。

+0

'列表'沒有包含'ContainsKey'的定義,也沒有找到接受類型'List '的第一個參數的擴展方法'ContainsKey'(您是否缺少using指令或程序集引用?) – Bart

+0

更改 列表 DrawLines = new List (); 至 Dictionary DrawLines = new Dictionary (); – wizzardmr42

+0

我編輯了我的答案,使其更清晰 – wizzardmr42

0

我看你要從頭開始做...這裏是一個辦法做到這一點

List<GlueLine> SortedList; 
List<GlueLine> DrawLines = new List<GlueLine>(); 
SortedList = a_listGlueLines.OrderBy(o => Math.Round(o.StartPosition.X,2)).ToList(); 

foreach(GlueLine current in SortedList){ 
    Boolean found = false; 
    foreach(GlueLine anyLine in DrawLines){ 
     if(current.StartPosition.Y == anyLine.StartPosition.Y){ 
      found = true; 
      break; 
     } 
    } 
    if(!found){ 
     DrawLines.Add(current); 
    } 
} 

如果你想有一個更優雅的方式,你可以用Kvam解決方案