LINQ查询按序列中非组对象之间的属性组计算对象

时间:2014-05-06 23:40:43

标签: c# linq lambda

我有一个对象列表,它们具有序列号属性(Seq)和InnerText属性(以及其他属性)。对象是文本文件中的记录(行)。

一些记录,其中InnerText以' X'在他们之后有一个或多个以' Y'开头的继续记录。我想将续集记录中的信息添加到' X'记录对象。

对于每个' X'记录我需要计算后续的' Y'记录停止在非下一个Y'记录。

我需要一种方法来计算“Y' x.Seq记录与下一个非Y'之间的记录。记录。

到目前为止,这是错误的LINQ语句:

public class File
{
    public Queue Records { get; set;}
}

public class Record
{
     public int Seq { get; set; }

     public string InnerText { get; set; }
}

foreach (Record record in Records)
{
    int recSeq = record.Seq;
        List<Record> aCopyOfRecords = records; 
        int numberOfYRecsFollowingX = aCopyOfRecords
        .Contains(element =>element.InnerText
        .StartsWith("Y") && (element.Seq > recSeq))).Count();
        for (int i = (recSeq + 1); i < (recSeq + numberOfYRecsFollowingX); i++)
    {
                Do Work adding fields etc...                            
    }
}

提前感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您可以使用SkipWhileTakeWhile方法

aCopyOfRecords
.SkipWhile(x => x != record)
.Skip(1)
.TakeWhile(x => x.InnerText.StartsWith("Y"));

这将为您提供以Y开头的特定记录后出现的X记录。为了获得计数,只需使用Count。如果要插入新项目您的列表,请使用List<T>.Insert方法:

var count =  aCopyOfRecords
           .SkipWhile(x => x != record) 
           .Skip(1)
           .TakeWhile(x => x.InnerText.StartsWith("Y"))
           .Count();

aCopyOfRecords.Insert(aCopyOfRecords.IndexOf(record) + count, newItem);