541 Stimmen

Wie man erste N Elemente einer Liste in C# erhalten?

Ich möchte Linq verwenden, um einen Busfahrplan in meinem Projekt abzufragen, so dass ich jederzeit die nächsten 5 Busankunftszeiten abrufen kann. Wie kann ich meine Abfrage auf die ersten 5 Ergebnisse beschränken?

Allgemeiner gesagt, wie kann ich ein Stück einer Liste in C# nehmen? (In Python würde ich verwenden mylist[:5] um die ersten 5 Elemente zu erhalten).

974voto

Matt Hamilton Punkte 193704
var firstFiveItems = myList.Take(5);

Oder zum Schneiden:

var secondFiveItems = myList.Skip(5).Take(5);

Und natürlich ist es oft praktisch, die ersten fünf Artikel in einer bestimmten Reihenfolge zu erhalten:

var firstFiveArrivals = myList.OrderBy(i => i.ArrivalTime).Take(5);

84voto

netadictos Punkte 7524

Für den Fall, dass jemand interessiert ist (auch wenn die Frage nicht nach dieser Version fragt), in C# 2 wäre: (Ich habe die Antwort bearbeitet, nach einigen Anregungen)

myList.Sort(CLASS_FOR_COMPARER);
List<string> fiveElements = myList.GetRange(0, 5);

11voto

Sina Lotfi Punkte 2495

Wie pagination können Sie das unten stehende Formular zur Einnahme verwenden slice of list or elements :

var slice = myList.Skip((pageNumber - 1) * pageSize)
                  .Take(pageSize);

Beispiel 1: Die ersten fünf Punkte

var pageNumber = 1;
var pageSize = 5;

Beispiel 2: zweite fünf Positionen

var pageNumber = 2;
var pageSize = 5;

Beispiel 3: Dritte fünf Positionen

var pageNumber = 3;
var pageSize = 5;

Wenn Sie die Parameter der Formeln beachten pageSize = 5 y pageNumber ändert sich, wenn Sie die Anzahl der Elemente in der Aufteilung ändern wollen, ändern Sie pageSize .

3voto

Valera Kolupaev Punkte 2265

Um die ersten 5 Elemente zu nehmen, verwenden Sie besser einen Ausdruck wie diesen:

var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5);

ou

var firstFiveArrivals = myList.Where([EXPRESSION]).Take(5).OrderBy([ORDER EXPR]);

Es wird schneller als orderBy-Variante, weil LINQ-Engine nicht durch alle Liste aufgrund der verzögerten Ausführung scannen, und wird nicht alle Array sortieren.

class MyList : IEnumerable<int>
{

    int maxCount = 0;

    public int RequestCount
    {
        get;
        private set;
    }
    public MyList(int maxCount)
    {
        this.maxCount = maxCount;
    }
    public void Reset()
    {
        RequestCount = 0;
    }
    #region IEnumerable<int> Members

    public IEnumerator<int> GetEnumerator()
    {
        int i = 0;
        while (i < maxCount)
        {
            RequestCount++;
            yield return i++;
        }
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    #endregion
}
class Program
{
    static void Main(string[] args)
    {
        var list = new MyList(15);
        list.Take(5).ToArray();
        Console.WriteLine(list.RequestCount); // 5;

        list.Reset();
        list.OrderBy(q => q).Take(5).ToArray();
        Console.WriteLine(list.RequestCount); // 15;

        list.Reset();
        list.Where(q => (q & 1) == 0).Take(5).ToArray();
        Console.WriteLine(list.RequestCount); // 9; (first 5 odd)

        list.Reset();
        list.Where(q => (q & 1) == 0).Take(5).OrderBy(q => q).ToArray();
        Console.WriteLine(list.RequestCount); // 9; (first 5 odd)
    }
}

3voto

Mouad Amzil Punkte 21
        dataGridView1.DataSource = (from S in EE.Stagaire
                                    join F in EE.Filiere on
                                    S.IdFiliere equals F.IdFiliere
                                    where S.Nom.StartsWith("A")
                                    select new
                                    {
                                        ID=S.Id,
                                        Name = S.Nom,
                                        Prénon= S.Prenon,
                                        Email=S.Email,
                                        MoteDePass=S.MoteDePass,
                                        Filiere = F.Filiere1
                                    }).Take(1).ToList();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X