Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 从列表中选择最后一个错误项_C#_Linq - Fatal编程技术网

C# 从列表中选择最后一个错误项

C# 从列表中选择最后一个错误项,c#,linq,C#,Linq,我有一个带有Time属性的项目列表。如果我想选择时间等于或大于某个开始时间的所有项目,那么我会这样写: var newList = list.Where(i => (i.Time >= startTime)); 但现在我还想得到最后一项,其中时间小于startTime。有没有更好的方法来实现这一点 例如,我有一个列表,其中项目在此列表中有时间: [5:32, 5:46, 5:51, 6:07, 6:11, 6:36] 我们将startTime指定为6:00 现在我们想得到这个时间

我有一个带有
Time
属性的项目列表。如果我想选择
时间
等于或大于某个
开始时间
的所有项目,那么我会这样写:

var newList = list.Where(i => (i.Time >= startTime));
但现在我还想得到最后一项,其中时间小于
startTime
。有没有更好的方法来实现这一点

例如,我有一个列表,其中项目在此列表中有
时间

[5:32, 5:46, 5:51, 6:07, 6:11, 6:36]
我们将
startTime
指定为
6:00

现在我们想得到这个时间:

[5:51, 6:07, 6:11, 6:36]

立即获取整个列表:

var newList = list
    .OrderByDescending(i => i.Time)
    .Take(list.Count(j => j.Time >= startTime) + 1)
    .OrderBy(k => k.Time); //Optional
根据认知的建议:

var newList = list
    .OrderBy(i => i.Time)
    .Skip(list.Count(j => j.Time < startTime - 1));
var newList=list
.OrderBy(i=>i.Time)
.Skip(list.Count(j=>j.Time
立即获取整个列表:

var newList = list
    .OrderByDescending(i => i.Time)
    .Take(list.Count(j => j.Time >= startTime) + 1)
    .OrderBy(k => k.Time); //Optional
根据认知的建议:

var newList = list
    .OrderBy(i => i.Time)
    .Skip(list.Count(j => j.Time < startTime - 1));
var newList=list
.OrderBy(i=>i.Time)
.Skip(list.Count(j=>j.Time
var smallerThan=list
.Where(i=>i.Timeo.Time)
.采取(1)
.Concat(list.Where(i=>i.Time=>startTime));
var smallerThan=list
.Where(i=>i.Timeo.Time)
.采取(1)
.Concat(list.Where(i=>i.Time=>startTime));
var结果=列表
.Where(i=>i.Timei.Time)
.Last()
康卡特先生(名单)
.OrderBy(i=>i.Time)
.Where(i=>i.Time>=startTime)
);

var结果=列表
.OrderBy(i=>i.Time)
.Last(i=>i.Timei.Time)
.Where(i=>i.Time>=startTime)
);
var结果=列表
.Where(i=>i.Timei.Time)
.Last()
康卡特先生(名单)
.OrderBy(i=>i.Time)
.Where(i=>i.Time>=startTime)
);

var结果=列表
.OrderBy(i=>i.Time)
.Last(i=>i.Timei.Time)
.Where(i=>i.Time>=startTime)
);
var newList=list
.其中(i=>(i.Time>=startTime))
托利斯先生()
.添加(列表)
.其中(i=>(i.Timeo.Time)
.FirstOrDefault()
)
var newList=list
.其中(i=>(i.Time>=startTime))
托利斯先生()
.添加(列表)
.其中(i=>(i.Timeo.Time)
.FirstOrDefault()
)
int lastItemIndex=list.OrderBy(D=>D.TimeOfDay.ToList())
.FindLastIndex(D=>D.TimeOfDaylist.IndexOf(D)>lastItemIndex);
int lastItemIndex=list.OrderBy(D=>D.TimeOfDay.ToList())
.FindLastIndex(D=>D.TimeOfDaylist.IndexOf(D)>lastItemIndex);

由于您的列表是按照您要查找的属性的顺序排列的,因此您可以按照

List<int> things = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
int threshold = 4;
var newThings = things.Skip(things.FindIndex(x => x >= threshold) - 1);
Console.WriteLine(string.Join(", ", newThings));
样本输出:

03:03:57,04:09:37,05:14:44,06:58:55,07:40:33,08:37:06,09:10:06


由于您的列表是按照您要查找的属性的顺序排列的,因此您可以按照

List<int> things = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
int threshold = 4;
var newThings = things.Skip(things.FindIndex(x => x >= threshold) - 1);
Console.WriteLine(string.Join(", ", newThings));
样本输出:

03:03:57,04:09:37,05:14:44,06:58:55,07:40:33,08:37:06,09:10:06


许多答案似乎需要降序排列。但您可以通过清洁的单内衬和良好的效率轻松避免这种情况:

var newList = list.Skip(list.Count(j => j.Time < startTime) - 1);
var newList=list.Skip(list.Count(j=>j.Time
许多答案似乎需要降序排列。但您可以通过清洁的单内衬和良好的效率轻松避免这种情况:

var newList = list.Skip(list.Count(j => j.Time < startTime) - 1);
var newList=list.Skip(list.Count(j=>j.Time
澄清:“获取最后一项,该项的时间小于“开始时间”
time
属性属于
DateTime
类型?是的,time属性属于DateTime类型。安装Skeet的扩展方法。然后你可以使用
MaxBy
@Pedro No,这个时间间隔可以是几分钟到很多小时。澄清:“获取最后一个项目,哪个时间比“开始时间”小”
time
属性是
DateTime
类型?是的,time属性是DateTime类型。安装Skeet的扩展方法。然后您可以使用
MaxBy
@Pedro No,这个时间间隔可以是几分钟到很多小时。只需将
Where
谓词直接传递到
Last
。要短得多。还有?我没有说要删除
OrderBy
。我刚才说了nix the
Where
;)只需将
Where
谓词直接传递到
Last
。要短得多。还有?我没有说要删除
OrderBy
。我刚才说了nix the
Where
;)从字面上看,写这篇文章的方法有几十种,但这可能是我自己会用的方法。另一种方法是找到第一条记录的时间小于开始时间,然后选择所有大于或等于该时间的记录。实际上,有几十种方法可以写这个,但这可能是我自己会使用的方法。另一种方法是找到第一条记录的时间小于开始时间,并选择大于或等于该时间的所有记录。您可以将OrderByDescending替换为Skip,
var newList=list.Skip(list.Count(j=>j.time
您可以用Skip替换OrderByDescending和Take,
var newList=list.Skip(list.Count(j=>j.Time
class Z
{
    public TimeSpan Time { get; set; }
};

class Program
{

    static void Main(string[] args)
    {
        Random rand = new Random();
        List<Z> zs = new List<Z>();
        for (int i = 0; i < 10; i++)
        {
            zs.Add(new Z { Time = new TimeSpan(i, rand.Next(0,61), rand.Next(0,61)) });
        }

        TimeSpan threshold = new TimeSpan(4,0,0);
        var newThings = zs.Skip(zs.FindIndex(x => x.Time >= threshold) - 1);
        Console.WriteLine(string.Join(", ", newThings.Select(x => x.Time.ToString("c"))));

        Console.ReadLine();

    }
}
var newList = list.Skip(list.Count(j => j.Time < startTime) - 1);