簡體   English   中英

通過子列表LINQ C#中的值區分行

[英]Distinct rows by their values from sub list LINQ C#

我想使用LINQ語法從子列表中刪除重復行的值。 下面我附上了以不同方式執行此操作的代碼。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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)}}}
        };

在這種情況下,我將考慮編寫一個自定義的相等比較器,然后可以將其插入Distinct方法中。 為此,您需要兩個函數EqualsGetHashCode

注意:重要的是, GetHashCode對於兩個相等的對象返回相同的哈希,因為這是Distinct檢查的第一件事。

根據我從您的代碼中收集到的信息,如果兩個ZRowXRow具有相同的平均值序列,則它們相等,因此,我們的相等性是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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM