我想比较2个列表。
1个列表中有一些GlueLines
这些是具有2个属性的对象:StartPosition
,EndPosition
(PointF
}
列表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个对象与另一个列表中的所有对象进行比较?
答案 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解决方案