将C#List <t>拆分为两个</t>

时间:2010-08-18 15:56:16

标签: c# asp.net generics list

我正在使用C#和ASP.NET 3.5。基本上我正在从数据集中检索一列数据并将其放入如下列表:

    List<String> dates = new List<String>();

    foreach (DataRow rowMonth in myDS.Tables[0].Rows)
    {
        string ListedMonthYear = (string)rowMonth[0];
        dates.Add(ListedMonthYear);
    }

返回的值为:

 Apr-10
 Mar-10
 Feb-10
 Jan-10
 Dec-09
 Nov-09
 Oct-09

我有兴趣将这些值分成两个列表,并希望将来对它们执行操作。

Apr   |  2010
Mar   |  2010
Feb   |  2010
Jan   |  2010
Dec   |  2009
Nov   |  2009
Oct   |  2009

最好的方法是什么?

编辑:rowMonth只是包含所有日期相关值的数据行 - 月 - 月,月开始,月结,月活动或非活动。基本上我只是试图提取第一个列的月份来进行操作而忽略其余部分。

4 个答案:

答案 0 :(得分:5)

您可以使用LINQ:

var months = (from item in dates
              select item.Substring(0, 3))
             .ToList();

var years  = (from item in dates
              select 2000 + int.Parse(item.Substring(4, 2)))
             .ToList();

您可能更喜欢将这两个部分分别存储在同一个列表中:

var result = (from item in dates
              select Tuple.Create(item.Substring(0, 3),
                                  2000 + int.Parse(item.Substring(4, 2))))
             .ToList();

答案 1 :(得分:4)

这样您就不会在列表上迭代两次。但它只适用于2k及以上的年份,我认为你想要多年作为整数列表。

List<string> months = new List<string>();
List<int> years = new List<int>();


dates.ForEach(s =>
            {
                months.Add(s.Substring(0, 3));
                years.Add(2000 + int.Parse(s.Substring(4, 2)));
            });

答案 2 :(得分:2)

如果您在2000年之后只有日期,则可以执行以下操作:

dates.Select(d => d.Split('-')).Select(parts => new { Month = parts[0], Year = "20"+parts[0]})

答案 3 :(得分:2)

我会考虑使用DateTime对象而不是string,以便您可以即时派生日期/时间表示,而不必维护两个列表。

例如,您的原始解析方法可以更改为以下内容。

List<DateTime> dates = new List<DateTime>();

foreach (DataRow rowMonth in myDS.Tables[0].Rows)
{
    DateTime rowDate = DateTime.Parse(rowMonth[0]);
    dates.Add(rowDate);
}

然后要生成两个必需列表,可以按如下方式使用linq。

// Converting to lists to demonstrate, though may not be required in your app.
List<short> years = dates.Select(d => d.Year).ToList();
List<string> months = dates.Select(d =>
    CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(d.Month)).ToList();

请注意,这并不是您想要的,因为有一些小警告。

    如果行中的日期不是众所周知的日期格式,则可能需要使用格式字符串来定制
  • DateTime.Parse
  • GetMonthName()返回完整的月份名称;你可以破解解决方案来获取字符串的前三个字符,但可能有一个更优雅的解决方案。