Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取相应值发生更改的行值-LINQ_C#_Wpf_Linq - Fatal编程技术网

C# 如何获取相应值发生更改的行值-LINQ

C# 如何获取相应值发生更改的行值-LINQ,c#,wpf,linq,C#,Wpf,Linq,对不起,标题有点模糊,想不出好的 我有一个对象列表,其中包含一些最大和最小限制值以及一个时间戳 举例来说,我用来显示该列表内容的网格可以如下所示(非常简化): 现在,我只需执行一个select distinct,以获取distinct限制并将其添加到列表中,如下所示: var limitdistinct = printIDSPC.Select(x => new { x.LimitMin, x.LimitMax }).Distinct(); 但是我也希望得到时间戳,在这里限制发生了变化(在

对不起,标题有点模糊,想不出好的

我有一个对象列表,其中包含一些最大和最小限制值以及一个时间戳

举例来说,我用来显示该列表内容的网格可以如下所示(非常简化):

现在,我只需执行一个select distinct,以获取distinct限制并将其添加到列表中,如下所示:

var limitdistinct = printIDSPC.Select(x => new { x.LimitMin, x.LimitMax }).Distinct();
但是我也希望得到时间戳,在这里限制发生了变化(在上面的例子中是08:05)。我似乎不知道该如何做到这一点。我考虑了Distinct在幕后的实际工作方式,以及您是否可以从select语句中获得时间戳。我是否必须在foreach循环中遍历整个列表,并比较这些值以查看其更改的位置


有什么帮助吗?

一种解决方案是按最小值/最大值分组,然后按开始时间排序,最后选择第一个时间值:

var list = new List<Foo>
{
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:00") },
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:01") },
    new Foo { LimitMin = 1, LimitMax = 2, StartTime = TimeSpan.Parse("08:03") },
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:05") },
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:06") },
    new Foo { LimitMin = 2, LimitMax = 5, StartTime = TimeSpan.Parse("08:10") },
};

var tmp = list
    .GroupBy(z => new { z.LimitMin, z.LimitMax })
    .Select(z =>
        new
        {
            Time = z.OrderBy(z2 => z2.StartTime).First().StartTime,
            Min = z.Key.LimitMin,
            Max = z.Key.LimitMax
        })
    .ToList();
var list=新列表
{
新的Foo{LimitMin=1,LimitMax=2,StartTime=TimeSpan.Parse(“08:00”)},
新的Foo{LimitMin=1,LimitMax=2,StartTime=TimeSpan.Parse(“08:01”)},
新的Foo{LimitMin=1,LimitMax=2,StartTime=TimeSpan.Parse(“08:03”)},
新的Foo{LimitMin=2,LimitMax=5,StartTime=TimeSpan.Parse(“08:05”)},
新的Foo{LimitMin=2,LimitMax=5,StartTime=TimeSpan.Parse(“08:06”)},
新的Foo{LimitMin=2,LimitMax=5,StartTime=TimeSpan.Parse(“08:10”)},
};
var tmp=列表
.GroupBy(z=>new{z.LimitMin,z.LimitMax})
.选择(z=>
新的
{
Time=z.OrderBy(z2=>z2.StartTime).First().StartTime,
最小值=z.Key.LimitMin,
Max=z.Key.LimitMax
})
.ToList();

这里的诀窍是使用GroupBy而不是Distinct。然后,您可以获得每个限制对的最小时间戳:

items
    .GroupBy(x => new { x.LimitMin, x.LimitMax })
    .Select(x => new { 
        x.Key.LimitMin, 
        x.Key.LimitMax, 
        MinStartTime = x.Min(y => y.StartTime) 
    });
或者,由于GroupBy保留原始项目的顺序,因此获取每个项目的第一个时间戳:

items
    .GroupBy(x => new { x.LimitMin, x.LimitMax })
    .Select(x => new { 
        x.Key.LimitMin, 
        x.Key.LimitMax, 
        FirstStartTime = x.First().StartTime 
    });
试试这个:-

var limitdistinct = printIDSPC.GroupBy(x => new { x.LimitMax, x.LimitMin })
                                      .Select(x => new
                                          {
                                              LimitMin = x.Key.LimitMin,
                                              LimitMax = x.Key.LimitMax,
                                              MinTime = x.OrderBy(y => y.StartTime).First().StartTime
                                          });

.

决定接受你的第一个建议,这很有魅力。谢谢!
var limitdistinct = printIDSPC.GroupBy(x => new { x.LimitMax, x.LimitMin })
                                      .Select(x => new
                                          {
                                              LimitMin = x.Key.LimitMin,
                                              LimitMax = x.Key.LimitMax,
                                              MinTime = x.OrderBy(y => y.StartTime).First().StartTime
                                          });