【问题标题】:C# Sorting listbox items by date [duplicate]C#按日期对列表框项目进行排序[重复]
【发布时间】:2020-10-18 18:53:58
【问题描述】:

我有一些包含这种字符串的 txt。

 "xxxx || Expire = 2020-10-17:23-25-51";
  "xxxx || Expire = 2020-09-17:23-25-51" ; 

这些字符串在txt中有很多行(逐行) 我可以通过获取“2020-10-17”部分对这些进行排序,但我无法对整行进行排序。我的意思是我可以在 Expire = "2020-10-17" 之后获得字符,但我想对每一行进行排序。

locChar = AllIndexesOf(str, "Expire = ");
str = str.Substring(locChar[0], 10);
lstStr.Add(str);
..
   var Sortlist = lstStr.OrderByDescending(x =>
            {
                DateTime dt;
                DateTime.TryParse(x, out dt);
                return dt;
            }).ToList() ;

输出:

2020-07-21
2020-07-07
2020-06-28 

我想得到这样的输出

"xxxx || Expire = 2020-07-21"
"xxxx || Expire = 2020-07-07"

【问题讨论】:

  • 考虑将其解析为字符串的强类型模型。
  • A (Winforms) ListBox 可以将 objects 的集合作为 DataSource 以便您可以简单地按 date 对该源进行排序 在课堂上。简单易懂
  • 您需要将locChar = AllIndexesOf(str, "Expire = "); str = str.Substring(locChar[0], 10);移动到排序键选择器中并对原始数据进行排序。见重复。当然,还有更好的方法来解决您的问题,但重复项直接解决您的问题,并包括您可能更喜欢的替代方案。

标签: c#


【解决方案1】:

我建议的第一件事是修复输入行格式:

  • 不要使用: 来分隔日期和时间,因为它主要用作小时、分钟和秒部分之间的分隔符。
  • 与空格保持一致。
  • 似乎不需要双引号和分号。

您提供的输入看起来不是很好的测试用例。所以,我用下面作为一个:

"1 || Expire = 2020-10-17 23:25:51";
"2 || Expire = 2020-09-16 23:25:51";
"3 || Expire = 2020-09-10 23:25:51";

并添加using System.Linq,然后运行以下代码:

var inputLines = input.Split(new char[]{ '\n' });
var inputLineGroups = inputLines.Select(x => x.Split(new string[] { "||" }, StringSplitOptions.None));
var sortedLineGroups = inputLineGroups.OrderBy(y => y[1]);
var sortedFullLines = sortedLineGroups.Select(z => z[0] + "||" + z[1]);
    
foreach(var line in sortedFullLines){
    Console.WriteLine(line);
}

产生以下输出:

"3 || Expire = 2020-09-10 23:25:51";
"2 || Expire = 2020-09-16 23:25:51";
"1 || Expire = 2020-10-17 23:25:51";

如果你想删除小时,稍微改变一下就足够了。

【讨论】:

    【解决方案2】:

    这将按照您发布的逻辑对字符串列表进行排序:

      List<string> lstStr = new List<string>() { "xxxx || Expire = 2020-07-21:23-25-51" ,
                                                           "xxxx || Expire = 2020-06-28:23-25-51" ,
                                                           "xxxx || Expire = 2020-07-07:23-25-51" ,
                                                           "xxxx || Expire = 2020-10-17:23-25-51" ,
                                                           "xxxx || Expire = 2020-09-17:23-25-51" };
      lstStr = lstStr.Select(x => x.Split(':')[0]).ToList();
      lstStr.Sort((str1, str2) =>
      {
          DateTime dt1;
          DateTime.TryParse(str1.Substring(str1.IndexOf("Expire = ") + 9, 10), out dt1); 
    
          DateTime dt2;
          DateTime.TryParse(str2.Substring(str2.IndexOf("Expire = ") + 9, 10), out dt2);
          return dt1.CompareTo(dt2);
      });
    
      lstStr.ForEach(x => Console.WriteLine(x));
    

    你说你有一个列表框,所以如果你想对其进行排序,你可以从列表框继承并覆盖其中的排序方法,这样你就可以设置listBox.Sorted = true (它不会修改字符串,但会保持排序)

        public class SortedListbox : ListBox
        {
            public SortedListbox() : base()
            {
            }
    
            protected override void Sort()
            {
                if (Items.Count > 1)
                {
                    object dataSource = null;
                    if (this.DataSource != null)
                    {
                        dataSource = this.DataSource;
                        this.DataSource = null;
                    }
    
                    bool swapped;
                    do
                    {
                        int counter = Items.Count - 1;
                        swapped = false;
    
                        while (counter > 0)
                        {
                            DateTime dt1;
                            DateTime.TryParse(Items[counter].ToString().Substring(Items[counter].ToString().IndexOf("Expire = ") + 9, 10), out dt1);
    
                            DateTime dt2;
                            DateTime.TryParse(Items[counter - 1].ToString().Substring(Items[counter - 1].ToString().IndexOf("Expire = ") + 9, 10), out dt2);
                            
                            if (dt1 < dt2)
                            {
                                object temp = Items[counter];
                                Items[counter] = Items[counter - 1];
                                Items[counter - 1] = temp;
                                swapped = true;
                            }
    
                            counter -= 1;
                        }
                    }
                    while ((swapped == true));
                    
                    if (dataSource != null)
                    {
                        this.DataSource = dataSource;
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2012-03-10
      • 1970-01-01
      • 2014-12-09
      • 2019-11-13
      • 1970-01-01
      • 2013-08-11
      相关资源
      最近更新 更多