我希望你能帮我解决这个问题。我有列表<列表< double []> > ,我想删除此列表中重复的所有内容。那就是:
1)在列表< double []> 有一些 double [] 是重复的。我想只保留List<中的非重复的double [] double []>。见图中的清单1和5.
2)在列表<列表< double []> > 有一些列表<双重[]> 是重复的。我想只保留非重复列表。见列表0& 2并列出1& 3。
图片中指定了所需的输出:
我尝试了以下但不起作用。
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();
}
你可以帮我解决这个问题吗?
答案 0 :(得分:3)
您的代码(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
来实现它自己的平等方法,你也不需要第二个相等比较器(你原来的代码就像它已经工作一样)是,最有可能)。
因此,为了避免将来出现此类问题,请尝试为您的问题声明特殊类型(而不是依赖于通用列表和数组,并像这里一样嵌套它们)。