2016-04-21 8 views
1

wiederholen habe ich eine Liste der benutzerdefinierten Objekte, zB:Linq jedes n-te Element für einen bestimmten Bereich innerhalb einer Liste <T>

public class MyObject 
{ 
    public int MyField { get; set; } 
} 

Die Liste hat 12 Objekte, in denen die MyField Eigenschaft anfänglich 0 ist, so die Objekte wäre:

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

ich möchte all n mal das Überspringen x Artikel wiederholen. Also, wenn ich 2 haben wiederholen und 3 überspringen, sollten die neuen Werte sein:

1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0

Wenn ich 3 mal wiederholen möchten und 4 überspringen, wären die neuen Werte:

1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0

Ist es möglich, dies mit Linq zu tun?

+1

Können Sie weitere Beispiele mit 0 und 1 statt true false liefern. Nicht ganz klar, was du erreichen willst. – Dmytro

+0

Es wäre sinnvoll, LINQ zu verwenden, um eine neue Liste zu erstellen, die wie beschrieben permutiert, aber nicht geändert wird. So könnten Sie eine neue Erweiterungsmethode für 'IEnumerable ' schreiben, die tun würde, was Sie brauchen. Etwas wie 'list = list.MyThing (2,3, x => x + 1)', wobei 'MyThing' das Lambda aufruft, um einen neuen Wert für die durch die Parameter skip/repeat angezeigten Elemente zu erhalten, und gibt die anderen Elemente zurück wie es sie findet. Alle He-Spats sind heutzutage wie ein Bruder, bist du sogar unveränderlich? OMG diese Sammlung ist buchstäblich so veränderlich, ich mag es nicht einmal. –

+0

Beachten Sie, dass meine Herangehensweise Spaß macht, aber wahrscheinlich kontraproduktiv ist, um Ihr Feature aus der Tür zu bekommen. –

Antwort

4

Linq ist für Abfrage, nicht Aktualisierung. Sie können Schreib Linq Methoden, die Nebenwirkungen haben, aber wegen der faulen Aufzählung und anderen Faktoren, eine gerade for oder foreach Schleife bevorzugt:

int repeat = 2; 
int skip = 3; 
for(int i = 0; i < list.Count && repeat > 0; i += skip) 
{ 
    list[i].MyField = 1; 
    repeat--; 
} 
2

Sie könnten möglicherweise zwei Ansätze kombinieren, um eine Where() Klausel über jedes n-ten Element zum Ziel:

// This would target every nth element of your collection (i being the index) 
collection.Where((x,i) => i % n == 0); 

Zusammen mit einem Skip() Anruf eine bestimmte Anzahl von Elementen überspringen:

// This would skip n elements, returning those that remained after the nth index 
collection.Skip(n); 

Es kann einfacher sein, einfach eine Schleife zu verwenden und durch Ihre einzelnen Elemente zu durchlaufen, Ihre Bedingung über den Modulo-Operator % zu prüfen (um zu sehen, ob es das n-te Element ist) und dann einezu verwenden 210 wenn nötig.

Verwandte Themen