将旧列表过滤到新列表C#

时间:2015-10-29 13:55:09

标签: c# list

我想比较2个列表。

1个列表中有一些GlueLines这些是具有2个属性的对象:StartPositionEndPositionPointF}

列表2为空,需要填充新行。

我只想在DrawLines列表中没有其他具有该特定StartPosition.Y值的对象时添加新的GlueLine

您可以在下面找到代码:

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个对象与另一个列表中的所有对象进行比较?

3 个答案:

答案 0 :(得分: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)));
    }
}

答案 1 :(得分: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。这不是非常有效,但您可能觉得编码/阅读更容易。

答案 2 :(得分: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解决方案