gpt4 book ai didi

c# - 删除 List> 中重复的所有内容

转载 作者:行者123 更新时间:2023-11-30 16:07:10 25 4
gpt4 key购买 nike

我希望你能帮我解决这个问题。我有一个 List < List < double[] >> 并且我想删除该列表中重复的所有内容。即:

1) 在 List < double[] > 中有一些 double[] 是重复的。我只想保留不重复的 double [ ] 在 List < double[] > 中。请参见图中的 list 1 和 list 5。

2) List < List < double[] >> 中有一些 List < double[] > 是重复的。我只想保留非重复列表。请参阅列表 0 和 2 以及列表 1 和 3。

图片中指定了所需的输出:

enter image description here

我已经尝试了以下但它不起作用。

public static List<List<double[]>> CleanListOfListsOfDoubleArray(List<List<double[]>> input)
{
var output = new List<List<double[]>>();

for (int i = 0; i < input.Count; i++)
{
var temp= input[i].Distinct().ToList();
output.Add(temp);
}
return output.Distinct().ToList();
}

你能帮我解决这个问题吗?

最佳答案

您的代码(不包括 ToList 收集器)在逻辑上似乎等同于:

return input.Select(t => t.Distinct()).Distinct();

您正在尝试使用 Distinct关于收藏。这是合理的,因为您期望获得不同的集合

问题是你离开了Distinct没有逻辑来比较这些集合。在不指定该逻辑的情况下,Distinct无法正确比较集合(通过每个成员的相等性)。

还有一个重载 Distinct这需要 IEqualityComparer<T>作为论据。要使用它,您必须先实现这样一个比较器。合理的实现(改编自 Cédric Bignon's answer )可能如下所示:

public class ArrayComparer<T> : IEqualityComparer<T[]>
{
public bool Equals(T[] x, T[] y)
{
return ReferenceEquals(x, y) || (x != null && y != null && x.SequenceEqual(y));
}

public int GetHashCode(T[] obj)
{
return 0;
}
}

public class ListOfArrayComparer<T> : IEqualityComparer<List<T[]>>
{
public bool Equals(List<T[]> x, List<T[]> y)
{
return ReferenceEquals(x, y) || (x != null && y != null && x.SequenceEqual(y, new ArrayComparer<T>()));
}

public int GetHashCode(List<T[]> obj)
{
return 0;
}
}

您的代码应该如下所示:

    public static List<List<double[]>> CleanListOfListsOfDoubleArray(List<List<double[]>> input)
{
var output = new List<List<double[]>>();

for (int i = 0; i < input.Count; i++)
{
var temp = input[i].Distinct(new ArrayComparer<double>()).ToList();
output.Add(temp);
}
return output.Distinct(new ListOfArrayComparer<double>()).ToList();
}

甚至只是:

    public static List<List<double[]>> CleanListOfListsOfDoubleArray(List<List<double[]>> input)
{
var output = input.Select(t => t.Distinct(new ArrayComparer<double>()).ToList()).ToList();

return output.Distinct(new ListOfArrayComparer<double>()).ToList();
}

请记住,如果您使用更具体的类型来描述您的问题,这会简单得多。

例如,如果不是 double[] ,您使用了更具体的对类型(如 Tuple<double, double> ),您只需要实现一个比较器(如果我没记错的话,第一个 Distinct 调用可以保留其默认行为)。

如果,而不是 List<double>你有一个专门的PairCollection实现自己的相等方法,您也不需要第二个相等比较器(您的原始代码很可能会像现在一样工作)。

因此,为了避免将来出现此类问题,请尝试为您的问题声明专门的类型(而不是像此处那样依赖通用列表和数组并嵌套它们)。

关于c# - 删除 List<List<double[]>> 中重复的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com