我为这个含糊不清的标题道歉.我不能同时保持清晰和简洁.所以随时改变它.
我有一个很大的列表,其中包含其他几个列表.这些内部列表包含Column对象.
List<List<Column>> listOfAllColumns;
Run Code Online (Sandbox Code Playgroud)
假设我的内部列表包含不同的Column对象,如下所示:
list1 = {c1, c1, c2}
list2 = {c1, c2, c1}
list3 = {c2, c3}
list4 = {c1,c1, c2}
Run Code Online (Sandbox Code Playgroud)
大列表包含以下列表:listOfAllColumns = {list1,list2,list3,list4}
现在我想要一个从listOfAllColumns列表中删除重复列表的方法.例如,它将查看上面的列表并删除list4.
list1: c1,c1,c2
list2: c1,c2,c1
list3: c2,c3
list4: c1,c1,c2 (it is equal to list1 so it is a duplicate)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
public class ColumnList
{
public void RemoveDuplicateColumnTypes()
{
Column c1 = new Column() { SectionName = "C50", StirrupType = "Tie" };
Column c2 = new Column() { SectionName = "C50", StirrupType = "Spiral" };
Column c3 = new Column() { SectionName = "C40", StirrupType = "Tie" };
List<Column> list1 = new List<Column>() { c1, c1, c2 };
List<Column> list2 = new List<Column>() { c1, c2, c1 };
List<Column> list3 = new List<Column>() { c2, c3 };
List<Column> list4 = new List<Column>() { c1, c1, c2 };
List<List<Column>> listOfAllColumns = new List<List<Column>>() { list1, list2, list3, list4 };
var result = listOfAllColumns.Distinct();
}
}
class Column
{
public string SectionName;
public string StirrupType;
public int StirrupSize;
public double StirrupSpacing;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,顺序很重要,例如{c1,c2,c1}与{c2,c1,c1}不同.
你需要的IEqualityComparer是能够比较不同序列的东西.这并不是特别难,因为它还有一种比较其中项目的方法:
public class SequenceComparer<T> : IEqualityComparer<IEnumerable<T>>
{
private IEqualityComparer<T> comparer;
public SequenceComparer(IEqualityComparer<T> comparer = null)
{
this.comparer = comparer ?? EqualityComparer<T>.Default;
}
public bool Equals(IEnumerable<T> x, IEnumerable<T> y)
{
return x.SequenceEqual(y, comparer);
}
public int GetHashCode(IEnumerable<T> sequence)
{
unchecked
{
int hash = 19;
foreach (var item in sequence)
hash = hash * 79 + comparer.GetHashCode(item);
return hash;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在您需要做的就是创建一个IEqualityComparer<Column>能够比较两个列对象(通过您想要的任何有意义的方式,可能是默认实现是不够的).
然后你可以把它们传递给Distinct:
var query = listOfAllColumns.Distinct(
new SequenceComparer<Column>(new ColumnComparer()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |