我想使用LINQ语法从子列表中删除重复行的值。下面我附上了以不同方式做到的代码。
xxxxx xxxxxx xxxxxxx xxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxxxxxxxx
List<ZRowCollection> zListCollection = new List<ZRowCollection>();
zListCollection = zListCollection.OrderBy(p => p.P).ToList();
int i1 = 1;
foreach (var item in zListCollection.ToList())
{
var subList1 = item.XRowModified.Select(p => p).ToList();
foreach (var item2 in zListCollection.Skip(i1).ToList())
{
var subList2 = item2.XRowModified.Select(p => p).ToList();
int i = 0;
foreach (var item3 in subList1)
{
var t2 = subList2.Select(p => p.Average).ToList();
decimal average = t2[i];
if (item3.Average == average)
{
i++;
}
else break;
}
if (i == item2.XRowModified.Count)
{
zListCollection.Remove(item2);
}
}
i1++;
}
属性
class XRowModified
{
public decimal Id { get; set; }
public decimal Open { get; set; }
public decimal High { get; set; }
public decimal Low { get; set; }
public decimal Close { get; set; }
public DateTime Time { get; set; }
public decimal Average { get; set; }
}
class ZRowCollection
{
public ZRowCollection()
{
this.XRowModified = new HashSet<XRowModified>();
}
public int P { get; set; }
public int High { get; set; }
public int Low { get; set; }
public virtual ICollection<XRowModified> XRowModified { get; set; }
}
预期的输入/输出,
作为List<XRowModified>
List<ZRowCollection> zListInput = new List<ZRowCollection>(){
new ZRowCollection(){P = 0,High = 4,Low = 0, XRowModified = new List<XRowModified>(){
new XRowModified(){ Id = 1550, Open = 1.22M,High = 1.24M,Low = 1.21M,Close = 1.23M,Average = 1.225M,
Time = new DateTime(2012, 11, 9, 12, 23, 23, 222)},
new XRowModified(){ Id = 1551, Open = 1.20M,High = 1.24M,Low = 1.22M,Close = 1.20M,Average = 1.23M,
Time = new DateTime(2012, 11, 9, 12, 23, 25, 122)}}},
new ZRowCollection(){P = 1,High = 3,Low = 0, XRowModified = new List<XRowModified>(){
new XRowModified(){ Id = 1555, Open = 1.22M,High = 1.24M,Low = 1.21M,Close = 1.23M,Average = 1.225M,
Time = new DateTime(2012, 11, 9, 12, 23, 40, 422)},
new XRowModified(){ Id = 1556, Open = 1.20M,High = 1.25M,Low = 1.20M,Close = 1.20M,Average = 1.23M,
Time = new DateTime(2012, 11, 9, 12, 23, 46, 522)}}},
new ZRowCollection(){P = 2,High = 2,Low = 0, XRowModified = new List<XRowModified>(){
new XRowModified(){ Id = 1558, Open = 1.22M,High = 1.24M,Low = 1.21M,Close = 1.23M,Average = 1.225M,
Time = new DateTime(2012, 11, 9, 12, 30, 11, 622)},
new XRowModified(){ Id = 1559, Open = 1.20M,High = 1.24M,Low = 1.22M,Close = 1.20M,Average = 1.23M,
Time = new DateTime(2012, 11, 9, 12, 30, 12, 822)}}}
};
List<ZRowCollection> zListOutput = new List<ZRowCollection>(){
new ZRowCollection(){P = 0,High = 4,Low = 0, XRowModified = new List<XRowModified>(){
new XRowModified(){ Id = 1550, Open = 1.22M,High = 1.24M,Low = 1.21M,Close = 1.23M,Average = 1.225M,
Time = new DateTime(2012, 11, 9, 12, 23, 23, 222)},
new XRowModified(){ Id = 1551, Open = 1.20M,High = 1.24M,Low = 1.22M,Close = 1.20M,Average = 1.23M,
Time = new DateTime(2012, 11, 9, 12, 23, 25, 122)}}}
};
答案 0 :(得分:0)
在这种情况下,我会考虑编写一个自定义相等比较器,然后可以将其插入到Distinct
方法中。为此,您需要两个函数Equals
和GetHashCode
。
注意:GetHashCode
为两个相等的对象返回相同的哈希值很重要,因为这是Distinct
检查的第一件事。
根据我从代码中收集的内容,如果ZRow
的{{1}}具有相同的平均序列,那么两个XRow
是相等的,所以我们的平等是averageSequence1.SequenceEqual(averageSequence2)
将被实现的如此:
public class CustomComparer : IEqualityComparer<ZRowCollection>
{
public static CustomComparer Instance { get { return new CustomComparer(); } }
Int32 IEqualityComparer<ZRowCollection>.GetHashCode(ZRowCollection value)
{
//One could also use the sum of the averages here, but went for simplicity...
return value.XRowModified.Count;
}
Boolean IEqualityComparer<ZRowCollection>.Equals(ZRowCollection z1, ZRowCollection z2)
{
return z1.XRowModified.Select(x => x.Average)
.SequenceEqual(z2.XRowModified.Select(x => x.Average));
}
}
将使用如下:
var distinctList = zListCollection.Distinct(CustomComparer.Instance);