求教一个数据转换问题

miao0099 2014-05-04 11:13:15
我数据库 有 2014年1月,2014年2月2014年3月,2014年4月,2014年12月 和 201401,201402,201403,201404
的数据
怎么 将这些数据 转换为
当相连月份时 显示为 2014年(1-3)月,2014年(1-12)月, 2012年(2-12)月2013年(1-12)月 这样的格式
...全文
108 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
佛火 2014-05-04
  • 打赏
  • 举报
回复

using System;
using System.Linq;
using System.Collections.Generic;
using System.Globalization;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var samples = new string[] { 
                "2013年11月", "2013年12月", "2014年1月","2014年2月","2014年3月","2014年4月","2014年12月",
                "201401","201402","201403","201404"
            };

            var results = Convert(samples);
            foreach (var item in results)
            {
                Console.WriteLine(item);
            }
        }

        static IEnumerable<string> Convert(IEnumerable<string> dates)
        {
            var formats = new string[] { "yyyy年M月", "yyyyMM" };
            var sampleDates = dates.Select(
                str => DateTime.ParseExact(str, formats, null, DateTimeStyles.None)
                )
                .Distinct()
                .OrderBy(d => d);

            if (sampleDates.Any())
            {
                DateTime? start = null;
                DateTime? cursor = start;
                foreach (var item in sampleDates)
                {
                    if (start == null)
                    {
                        start = cursor = item;
                        continue;
                    }
                    if ((item - cursor.Value).TotalDays < 32d
                        && item.Year == cursor.Value.Year)
                    {
                        cursor = item;
                    }
                    else
                    {
                        if (cursor.Value == start.Value)
                        {
                            yield return string.Format("{0:yyyy年M月}", start);
                        }
                        else
                        {
                            yield return string.Format("{0:yyyy}年({0:%M}-{1:%M}月)", start, cursor);
                        }
                        cursor = start = item;
                    }
                }
                if (cursor != null)
                {
                    if (cursor.Value == start.Value)
                    {
                        yield return string.Format("{0:yyyy年M月}", start);
                    }
                    else
                    {
                        yield return string.Format("{0:yyyy}年({0:%M}-{1:%M}月)", start, cursor);
                    }
                }
            }
        }
    }
}
输出:

2013年(11-12月)
2014年(1-4月)
2014年12月
miao0099 2014-05-04
  • 打赏
  • 举报
回复
能 简单的写个例子吗 这种类型转换第一次做 完全没头绪
佛火 2014-05-04
  • 打赏
  • 举报
回复
将所有数据转换成为 DateTime ,从小到大排序, 然后执行一次循环,如果跟上一个日期的年份和月份相连,那就归并。
baysos 2014-05-04
  • 打赏
  • 举报
回复
以orderby排序取出数据,然后判断相邻两个数据的月份差值,等于1相邻,大于1不相邻,剩下的就不用说了吧?

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧