删除Dictionary>中的重复项
本文关键字:point Dictionary int List 删除 | 更新日期: 2023-09-27 18:16:05
我有以下代码:
Dictionary<int, List<PointF>> dictEntities = new Dictionary<int, List<PointF>>();
dictEntities.Add(1, new List<PointF>() { new PointF(1.0F, 2.0F), new PointF(3.0F, 4.0F) });
dictEntities.Add(2, new List<PointF>() { new PointF(3.0F, 4.0F), new PointF(1.0F, 2.0F) });
dictEntities.Add(3, new List<PointF>() { new PointF(7.0F, 8.0F), new PointF(9.0F, 6.0F) });
我想删除那些列表是重复的字典条目。删除重复项后的预期结果:字典现在包含2个条目("1"answers"3"或"2"answers"3"),因为条目1和2具有相同的PointF内部列表。1或2从字典中删除。我想我必须先对List进行排序然后在它上面做一个区分?但是如何删除重复的项呢?
到目前为止我所尝试的是:
foreach (var item in dictEntities.ToList())
{
while (dictEntities.Values.Contains(item.Value))
{
dictEntities.Remove(item.Key);
}
}
但是这总是清空整个字典。我得想个办法。
谢谢
您可以使用自定义IEqualityComparer
并使用GroupBy
来完成此操作。例如:
public class MyComparer : IEqualityComparer<List<PointF>>
{
public bool Equals(List<PointF> l1, List<PointF> l2)
{
//If lists contain different amount of items, they are different
if(l1.Count() != l2.Count()) return false;
//Order the lists by X then Y, that way we can compare them in order
var orderedL1 = l1.OrderBy(p => p.X).ThenBy(p => p.Y).ToList();
var orderedL2 = l2.OrderBy(p => p.X).ThenBy(p => p.Y).ToList();
for(var i = 0; i < l1.Count(); i++)
{
if(orderedL1[i].X != orderedL2[i].X) return false;
if(orderedL1[i].Y != orderedL2[i].Y) return false;
}
//They must be the same if we reached here
return true;
}
public int GetHashCode(List<PointF> dp)
{
return 0;
}
}
并像这样使用:
var distinctList = dictEntities
.GroupBy(de => de.Value, new MyComparer())
.Select(de => de.Key);
如果你想保持它作为一个字典,而不是Select
,使用ToDictionary
,并采取你选择的方法来选择键。下面是一个使用First
的示例(这意味着您将从示例中获得项目1和3):
var distinctList = dictEntities
.GroupBy(de => de.Value, new MyComparer())
.ToDictionary(g => g.First().Key, g => g.Key);