【问题标题】:Sort the two date columns individually and cumulative effect?单独排序两个日期列并累积效果?
【发布时间】:2017-05-25 12:23:39
【问题描述】:

我有两个日期列和两个大小列(一个大小列与一个日期列相关),如下表所示。现在我想要两个数组,在第一个数组中,它将按 Collected 排序,并显示 CollectedSize 的累积效果,与 Staged 和 StagedSize 相同。

必填:

收集的数组|
2016 年 1 月 1 日 | 1
2016 年 11 月 1 日 | 4
2016 年 12 月 1 日 | 6
2016 年 1 月 30 日 | 11

分段数组 |
2016 年 13 月 1 日 | 3
2016 年 14 月 1 日 | 7
18/1/2016 | 13
2016 年 16 月 1 日 | 20

表:

|收藏 |收集尺寸 |上演 |分段大小 |

| 2016 年 11 月 1 日 | 3 | 2016 年 14 月 1 日 | 4

| 2016 年 12 月 1 日 | 2 | 2016 年 13 月 1 日 | 3

| 2016 年 1 月 30 日 | 5 | 18/1/2016 | 7

| 2016 年 1 月 1 日 | 1 | 2016 年 16 月 1 日 | 6

目前使用如下代码:

public class ProductionDataOverTimeVM
{
    public ProductionDataOverTimeVM()
    {
        Collected = new List<TimeChartXAxis>();
        Staged = new List<TimeChartXAxis>();
    }
    public List<TimeChartXAxis> Collected { get; set; }
    public List<TimeChartXAxis> Staged { get; set; }
}
public class TimeChartXAxis
{
    public string x { get; set; }
    public string y { get; set; }
}

var queryResults = context.Datasets.ToList();
ProductionDataOverTimeVM obj = new ProductionDataOverTimeVM();
long? collectedBytes = 0;
long? Staged = 0;
foreach (var dataset in queryResults.OrderBy(d => d.Collected))
{
    if (dataset.Collected != null)
    {
        collectedBytes = collectedBytes + dataset.CollectedSize;
        obj.Collected.Add(new TimeChartXAxis
        {
            x = dataset.Collected != null ? BasicHelpers.FromUTCDate(dataset.Collected, parms.Offset).Value.ToString("dd/M/yyyy") : null,
            y = BasicHelpers.FormatBytesToSpecificFormat(collectedBytes, format, false)
        });
    }
}
foreach (var dataset in queryResults.OrderBy(d => d.Staged))
{
    if (dataset.Staged != null)
    {
        Staged = Staged + dataset.StagedSize;
        obj.Staged.Add(new TimeChartXAxis
        {
            x = dataset.Staged != null ? BasicHelpers.FromUTCDate(dataset.Staged, parms.Offset).Value.ToString("dd/M/yyyy") : null,
            y = BasicHelpers.FormatBytesToSpecificFormat(Staged, format, false)
        });
    }
}

最好的方法是什么?

【问题讨论】:

    标签: c# entity-framework linq


    【解决方案1】:

    怎么样

    var arrayofOrderByString = new []{"Collected","Staged"}
    
    foreach(var key in arrayofOrderByString){
    var y=0;
    SortList<Datasets>(queryResults, key, SortDirection.Descending);
    queryResults.foreach(s =>{
    y=s.GetType().GetProperty(key).GetValue(s, null);
    obj.Collected.Add(new ProductionDataOverTimeVM{
    x =BasicHelpers.FromUTCDate(s.GetType().GetProperty(key).GetValue(s, null), parms.Offset).Value.ToString("dd/M/yyyy"),
    y=collectedBytes
    })
    })
    }
    
    public void SortList<T>(List<T> list, string columnName, SortDirection direction)
    {
        var property = typeof(T).GetProperty(columnName);
        var multiplier = direction == SortDirection.Descending ? -1 : 1;
        list.Sort((t1, t2) => {
            var col1 = property.GetValue(t1);
            var col2 = property.GetValue(t2);
            return multiplier * Comparer<object>.Default.Compare(col1, col2);
        });
    }
    

    【讨论】:

    • 嗨@jitender 感谢您的回复...伙计,我们可以在这里最小化循环。在我的问题中,我只显示了两个,但我有 10 个数,我们在一个方法中应用了 10 个循环。就像在您的答案中一样,您还应用了两个循环。如果可能的话,我主要想尽量减少循环。
    • @Manjit 那么你应该修改你的问题。你应该把上面的评论放在你的问题中
    • @Manjit 更新了她的答案,如果可行的话。这只是一个你可以相应修改的想法
    • .foreach(s => 在 SortList 方法调用后给出异常。在方法调用后 .(dot) 之后没有 foreach 可用。:(
    • @Manjit 我只是更新答案,因为我已经说过这只是一个你需要相应修改的想法
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多