更改其中一个对象属性的类型,并使用LINQ对其进行排序

时间:2014-04-23 05:21:59

标签: c# wpf linq sorting

我想对对象属性为字符串类型的List进行排序。 其中一个属性是字符串类型的时间,当我尝试对它进行排序时,如下所示。

1:12, 13:24, 19:56, 2:15, 26:34, 8:42.

这里的排序是基于字符串进行的。 现在我想将这个刺激转换为加倍(1.12,13.24,19.56,2.15,26.34,8.42)并对其进行排序。然后通过替换'来填充数据。'与':'。

我尝试了类似下面的内容,但仍然按字符串进行排序。

public class Model
{
    public string Duration { get; set; }

    public string Dose { get; set; }
}

List<Model> lsModelData = new List<Model>();

//Added some model objects here

// query for sorting the lsModelData by time.
var sortedList = lsModelData.OrderBy(a => Convert.ToDouble(a.Duration.Replace(":", ".")));

我正在尝试更换时间&#34;:&#34;用&#34;。&#34;然后将其转换为double以执行排序操作。

任何人都可以更正此声明以正确地进行此排序。

3 个答案:

答案 0 :(得分:1)

如果您想根据持续时间对数据进行排序,请尝试此操作。它的测试肯定适合你。

 public class Models
     {
         public string Duration { get; set; }
         public string Dose { get; set; }
     }



List<Models> lstModels = new List<Models>();    
lstModels.Add(new Models { Duration = "101:12" });
lstModels.Add(new Models { Duration = "13:24" });
lstModels.Add(new Models { Duration = "19:56" });                       
List<Models> sortedList = (from models in lstModels
                             select new Models
                               {
                                 Dose = models.Dose,
                                 Duration = models.Duration.Replace(':','.')})
                          .ToList()
                          .OrderBy(x=>Convert.ToDouble(x.Duration))
                          .ToList();

答案 1 :(得分:0)

我不确定你真正想要的是什么,但是如果你想只返回持续时间,那么在排序后选择它

var sortedList = lsModelData.OrderBy(a => Convert.ToDouble(a.Duration.Replace(":", "."))).Select(a=> a.Duration).ToList();

var sortedList = lsModelData..Select(a=> a.Duration).OrderBy(a => Convert.ToDouble(a.Replace(":", "."))).ToList();

答案 2 :(得分:0)

在这种情况下,最好按长度排序,然后按内容排序:

var sortedList = lsModelData.OrderBy(a => a.Duration.Length)
                            .ThenBy(a => a.Duration)

在排序(或过滤)之前转换数据库数据总是使查询效率低下,因为索引不能再使用了。