Ho un oggetto IEnumerable e voglio ottenere un nuovo IEnumerable che contiene ogni elemento nesimo.Prendere ogni 2 ° oggetto nell'elenco
È possibile farlo in Linq?
Ho un oggetto IEnumerable e voglio ottenere un nuovo IEnumerable che contiene ogni elemento nesimo.Prendere ogni 2 ° oggetto nell'elenco
È possibile farlo in Linq?
Basta capito io ...
Il metodo IEnumerable<T>.Where()
ha un sovraccarico che prende l'indice dell'elemento corrente - proprio quello che il medico ha ordinato.
(new []{1,2,3,4,5}).Where((elem, idx) => idx % 2 == 0);
Questo sarebbe tornato
{1, 3, 5}
Update: Per coprire sia il mio caso d'uso e la suggestione di Dan Tao, mettiamoci anche specificare ciò che il primo elemento restituito dovrebbe essere:
var firstIdx = 1;
var takeEvery = 2;
var list = new []{1,2,3,4,5};
var newList = list
.Skip(firstIdx)
.Where((elem, idx) => idx % takeEvery == 0);
... restituire
{2, 4}
Per implementare Cristi's suggestion:
public static IEnumerable<T> Sample<T>(this IEnumerable<T> source, int interval)
{
// null check, out of range check go here
return source.Where((value, index) => (index + 1) % interval == 0);
}
Usage:
var upToTen = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = upToTen.Sample(2);
var multiplesOfThree = upToTen.Sample(3);
Puoi anche saltare l'array e usare 'Enumerable.Range (1,10)'. –
@Anthony: è solo un esempio, destinato alla comprensione immediata. So che alcuni sviluppatori dovrebbero cercare 'Enumerable.Range'. –
Anche se non LINQ si può anche creare un metodo di estensione con yield
.
public static IEnumerable<T> EverySecondObject<T>(this IEnumerable<T> list)
{
using (var enumerator = list.GetEnumerator())
{
while (true)
{
if (!enumerator.MoveNext())
yield break;
if (enumerator.MoveNext())
yield return enumerator.Current;
else
yield break;
}
}
}
Avvolgi quello in un 'uso'! ('IEnumerable' eredita' IDisposable'.) –
@Dan: si intende IEnumerator. Come mai non l'ho mai capito prima?
Sì, intendevo "IEnumerator". Ops! (Per qualche ragione ne scrivo sempre uno quando intendo digitare l'altro. Deve essere memoria muscolare.) –
La prima volta che ho visto un uso molto solido per l'indice in un predicato di raccolta, bravo, non ci avrei pensato. –
È possibile definire un metodo di estensione che restituisce questo.Ecco (...) per renderlo più chiaro nella propria app. – Douglas
Potrei suggerire di usare 'idx + 1' per abbinare la descrizione di" ogni elemento Nth "; almeno per me, questo suggerisce che il primo elemento restituito dovrebbe essere l'elemento Nth. Quindi ogni 2 ° elemento in '{1,2,3,4,5}' - to * me * - significa '{2,4}' (il codice restituisce '{1,3,5}'). Forse questo è soggettivo, però. –