LINQ的 - 差异其中previous元 [英] Linq - difference with previous element

查看:97
本文介绍了LINQ的 - 差异其中previous元的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法根据它们之间的区别组数据元素?

 名单,其中;消息>消息=新名单,其中;消息>();

类信息
{
    私营的DateTime日期{获得;组; }
    私人字符串文本{获得;组; }
}
 

在消息的日期示例数据:

  14.3 2014年20点28分15秒
14.3 2014年二十点32分17秒
14.3 2014年20点37分25秒
14.3 2014年22点38分43秒
14.3 2014年二十时40分23秒
14.3 2014年20点42分07秒
14.3 2014年20点43分54秒
14.3 2014年20点52分26秒
14.3 2014年20点53分41秒
14.3 2014年20点55分37秒
14.3 2014年20时58分44秒
 

我需要一个 LINQ 查询该组这样的。如果没有记录的六类分的,将启动一个新的组。

  1组
    14.3 2014年二十时28分15秒
    14.3 2014年二十点32分17秒

第2组
    14.3 2014年20点37分25秒
    14.3 2014年20点38分43秒
    14.3 2014年二十时40分23秒
    14.3 2014年20点42分07秒
    14.3 2014年20点43分54秒

第3组
    14.3 2014年20点52分26秒
    14.3 2014年20点53分41秒
    14.3 2014年20点55分37秒
    14.3 2014年20时58分44秒
 

解决方案

当然,我们可以创建自己的 GroupWhile 的方法,它可以让我们的项目组,同时满足条件

  VAR的查询= messages.GroupWhile((preV,电流)=>
    prev.Date.AddMinutes(6)> = current.Date));
 

GroupWhile 可以像这样实现:

 公共静态的IEnumerable< IEnumerable的< T>> GroupWhile< T>(
    这IEnumerable的< T>源,Func键< T,T,布尔> predicate)
{
    使用(VAR迭代= source.GetEnumerator())
    {
        如果(!iterator.MoveNext())
            产生中断;

        名单< T>名单=新的名单,其中,T>(){iterator.Current};

        牛逼previous = iterator.Current;

        而(iterator.MoveNext())
        {
            如果(!predicate(previous,iterator.Current))
            {
                得到的回报清单;
                名单=新的名单,其中,T>();
            }

            list.Add(iterator.Current);
            previous = iterator.Current;
        }
        得到的回报清单;
    }
}
 

Is there a way to group data elements based on the difference between them?

List<Message> messages = new List<Message>(); 

class Message
{
    private DateTime Date { get; set; }
    private string Text { get; set; }
}

Example data in messages date:

14.3 2014 20:28:15
14.3 2014 20:32:17
14.3 2014 20:37:25
14.3 2014 22:38:43
14.3 2014 20:40:23
14.3 2014 20:42:07
14.3 2014 20:43:54
14.3 2014 20:52:26
14.3 2014 20:53:41
14.3 2014 20:55:37
14.3 2014 20:58:44

I need a LINQ query that group like this. If no record six minutes, will start a new group.

Group 1
    14.3 2014 20:28:15
    14.3 2014 20:32:17

Group 2
    14.3 2014 20:37:25
    14.3 2014 20:38:43
    14.3 2014 20:40:23
    14.3 2014 20:42:07
    14.3 2014 20:43:54

Group 3
    14.3 2014 20:52:26
    14.3 2014 20:53:41
    14.3 2014 20:55:37
    14.3 2014 20:58:44

解决方案

Sure, we can create our own GroupWhile method, which lets us group items while a condition is met:

var query = messages.GroupWhile((prev, current) => 
    prev.Date.AddMinutes(6) >= current.Date));

GroupWhile can be implemented like so:

public static IEnumerable<IEnumerable<T>> GroupWhile<T>(
    this IEnumerable<T> source, Func<T, T, bool> predicate)
{
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
            yield break;

        List<T> list = new List<T>() { iterator.Current };

        T previous = iterator.Current;

        while (iterator.MoveNext())
        {
            if (!predicate(previous, iterator.Current))
            {
                yield return list;
                list = new List<T>();
            }

            list.Add(iterator.Current);
            previous = iterator.Current;
        }
        yield return list;
    }
}

这篇关于LINQ的 - 差异其中previous元的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆