2016-05-20 16 views
1

Ich habe eine Liste mit Artikeln, die eine Time Eigenschaft haben. Wenn ich alle Elemente auswählen möchten, wo Time gleich oder größer dann einige startTime, dann schreibe ich etwas wie folgt aus:Wählen Sie den letzten falschen Artikel aus der Liste

var newList = list.Where(i => (i.Time >= startTime)); 

Aber jetzt will ich auch den letzten Punkt gelangen, wo die Zeit kleiner als startTime ist. Gibt es einen besseren Weg, dies zu implementieren?

Zum Beispiel habe ich die Liste, wo Artikel Time aus dieser Liste haben:

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

Wir geben einen startTime als 6:00.

Jetzt wollen wir diese Zeiten erhalten:

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

Clarify: „Einen letzten Punkt bekommen, die Zeit ist kleiner als‚Startzeit‘“ –

+0

'Time' Eigenschaft ist von' DateTime' Typ? –

+0

Ja, Time-Eigenschaft ist vom DateTime-Typ. – Serbin

Antwort

3

die ganze Liste auf einmal bekommen:

var newList = list 
    .OrderByDescending(i => i.Time) 
    .Take(list.Count(j => j.Time >= startTime) + 1) 
    .OrderBy(k => k.Time); //Optional 

Mit Cognition Vorschlag:

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

können Sie OrderByDescending und Take mit einem Skip ersetzen, 'var newList = list.Skip (list.Count (j => j.Time PlantPorridge

1
var smallerThan = list 
    .Where(i => i.Time < startTime) 
    .OrderByDescending(o => o.Time) 
    .Take(1) 
    .Concat(list.Where(i => i.Time => startTime)); 
+2

Übergeben Sie das 'Where'-Prädikat direkt an' Last '. Viel kürzer. –

+0

Und? Ich habe nicht gesagt, um das 'OrderBy' zu entfernen. Ich sagte nur nix das 'Wo';) –

1
var result=list 
    .Where(i=>i.Time<startTime) 
    .OrderBy(i=>i.Time) 
    .Last() 
    .Concat(list 
    .OrderBy(i=>i.Time) 
    .Where(i=>i.Time>=startTime) 
); 

oder

var result=list 
    .OrderBy(i=>i.Time) 
    .Last(i=>i.Time<startTime) 
    .Concat(list 
    .OrderBy(i=>i.Time) 
    .Where(i=>i.Time>=startTime) 
); 
+0

Buchstäblich Dutzende von Möglichkeiten, dies zu schreiben, aber das ist wahrscheinlich die, die ich selbst verwenden würde. Ein anderer Ansatz wäre, die Zeit des ersten Datensatzes weniger als die Startzeit zu finden und alle, die größer oder gleich sind, auszuwählen. –

0
var newList = list 
    .Where(i => (i.Time >= startTime)) 
    .ToList() 
    .Add(list 
     .Where(i => (i.Time < startTime)) 
     .OrderByDescending(o => o.Time) 
     .FirstOrDefault() 
    ) 
+0

JMO, aber das scheint nicht gut lesbar. –

+0

danke ich verbesserte die Lesbarkeit – zpul

0
int lastItemIndex = list.OrderBy(D => D.TimeOfDay).ToList() 
         .FindLastIndex(D => D.TimeOfDay < startTime); 

var newList = list.Where(D => list.IndexOf(D) > lastItemIndex); 
1

Wie Ihre Liste ist, dass Sie der Immobilie finden, um möchten, können Sie etwas entlang der Linien von

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)); 

tun Welche

ausgibt

3, 4, 5, 6, 7, 8

Erweiterung es eine Klasse mit einer Time Eigenschaft zu verwenden, die eine TimeSpan passiert sein:

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(); 

    } 
} 

Beispielausgabe:

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

1

Viele Antworten scheinen eine absteigende Reihenfolge zu erfordern. Aber man kann dies leicht vermeiden mit einem sauberen Einzeiler und ein guten Wirkungsgrad:

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