开发者

Linq Query Need - Looking for a pattern of data

Say I have a collection of the following simple class:

public class MyEntity 
{
   public string SubId { get; set; }
   public System.DateTime ApplicationTime { get; set; }
   public double? ThicknessMicrons { get; set; }
}

I need to search through the entire collection looking for 5 consecutive (not 5 total, but 5 consecutive) entities that have a null ThicknessMicrons value. Consecutiveness will be based on the ApplicationTime property. The collection will be sorted on that property.

How can I do this in开发者_开发技巧 a Linq query?


You can write your own extension method pretty easily:

public static IEnumerable<IEnumerable<T>> FindSequences<T>(this IEnumerable<T> sequence, Predicate<T> selector, int size)
{
    List<T> curSequence = new List<T>();
    foreach (T item in sequence)
    {
        // Check if this item matches the condition
        if (selector(item))
        {
            // It does, so store it
            curSequence.Add(item);

            // Check if the list size has met the desired size
            if (curSequence.Count == size)
            {
                // It did, so yield that list, and reset
                yield return curSequence;
                curSequence = new List<T>();
            }
        }
        else
        {
            // No match, so reset the list
            curSequence = new List<T>();
        }
    }
}

Now you can just say:

var groupsOfFive = entities.OrderBy(x => x.ApplicationTime)
                            .FindSequences(x => x.ThicknessMicrons == null, 5);

Note that this will return all sub-sequences of length 5. You can test for the existence of one like so:

bool isFiveSubsequence = groupsOfFive.Any();

Another important note is that if you have 9 consecutive matches, only one sub-sequence will be located.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜