【问题标题】:Remove duplicate entries for 2D List in C#在 C# 中删除 2D 列表的重复条目
【发布时间】:2019-07-14 07:20:34
【问题描述】:

我正在尝试从此 2D 列表中删除示例重复条目。

我已经尝试过使用.Distinct().ToList() 中突出显示的一维列表的.Distinct().ToList() 方法,但在这里它似乎对我不起作用。

到目前为止我的代码:

List<List<float>> xyvertices = new List<List<float>>();
xyvertices.Add(new List<float>());
yvertices[0].Add(2);
xyvertices[0].Add(4);

for (int a = 1; a < 6; a++)
{
    xyvertices.Add(new List<float>());
    xyvertices[a].Add(a+1);
    xyvertices[a].Add(a+3);
}
xyvertices = xyvertices.Distinct().ToList();
Console.WriteLine("count:" + xyvertices.Count + "\n");

for (int i =0; i<xyvertices.Count; i++)
{
    Console.WriteLine(xyvertices[i][0]);
    Console.WriteLine(xyvertices[i][1]);
    Console.WriteLine();
}

Console.ReadLine();

上面的代码运行但没有任何变化。

我怎样才能做到这一点?谢谢

【问题讨论】:

  • 对于您的情况List&lt;List&lt;float&gt;&gt;中的非标准列表(或数组),您必须实现IEqualityComparer
  • 我正在寻找输出列表为 2D,与输入格式相同
  • @Cgameworld 帮助我们 - 分享您期望的输出
  • @Mureinik 预期的输出是只有一个 (2,4) 的副本,它被添加了两次。
  • 虽然我同意你的看法,但“没有任何变化”的描述并不是对问题的一个很好的陈述。

标签: c# generic-list


【解决方案1】:

Distinct 正在比较 Lists,由于前两个 List 是不同的,即使它们包含相同的两个数字,它们也不相等。

您的外部列表是 x,y 对的列表,因此您可以使用元组,而不是将它们编码为任意浮点列表。例如:

List<(float, float)> xyvertices = new List<(float, float)>();
xyvertices.Add((2, 4));
for (int a = 1; a < 6; a++)
{
    xyvertices.Add((a+1,a+3));
}

xyvertices = xyvertices.Distinct().ToList();
Console.WriteLine("count:" + xyvertices.Count + "\n");
for (int i = 0; i < xyvertices.Count; i++)
{
    Console.WriteLine(xyvertices[i]);
    Console.WriteLine();
}

【讨论】:

  • 顺便说一句,比较floats 的相等性并不是一个好的做法,因为它们不是精确的类型,请酌情使用Decimalint
【解决方案2】:

您可以按如下方式使用 Linq GroupBy 和 gruop by 第一个和第二个元素:

xyvertices = xyvertices.GroupBy(x=>new {first= x[0],second= x[1] })
            .Select(x=>new List<float> { x.Key.first, x.Key.second })
            .ToList();

输出:

count:5

2
4

3
5

4
6

5
7

6
8

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2012-04-10
    • 2012-03-20
    • 2014-12-28
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多