Como selecionar valores dentro de um intervalo índice previsto de uma lista usando o LINQ

StackOverflow https://stackoverflow.com/questions/1042087

  •  22-07-2019
  •  | 
  •  

Pergunta

Eu sou um novato LINQ tentar usá-lo para conseguir o seguinte:

Eu tenho uma lista de inteiros: -

List<int> intList = new List<int>(new int[]{1,2,3,3,2,1});

Agora, eu quero comparar a soma dos três primeiros elementos [gama índice 0-2] com os últimos três [faixa de índice 3-5] usando LINQ. Eu tentei o LINQ Select e Take métodos de extensão, bem como o método SelectMany, mas eu não consigo descobrir como dizer algo como

(from p in intList  
where p in  Take contiguous elements of intList from index x to x+n  
select p).sum()

Eu olhei para o método de extensão Contém também, mas que não vê para me o que eu quero. Alguma sugestão? Obrigado.

Foi útil?

Solução

Use Saltar em seguida, tomar.

yourEnumerable.Skip(4).Take(3).Select( x=>x )

(from p in intList.Skip(x).Take(n) select p).sum()

Outras dicas

Você pode usar GetRange ()

list.GetRange(index, count);

Para listas maiores, um método de extensão em separado poderia ser mais apropriado para o desempenho. Eu sei que isso não é necessário para o caso inicial, mas o Linq (a objetos) implementação depende de iteração da lista, portanto, para grandes listas este poderia ser (inutilmente) caro. Um método de extensão simples de conseguir isso poderia ser:

public static IEnumerable<TSource> IndexRange<TSource>(
    this IList<TSource> source,
    int fromIndex, 
    int toIndex)
{
    int currIndex = fromIndex;
    while (currIndex <= toIndex)
    {
        yield return source[currIndex];
        currIndex++;
    }
}

Para filtro por índices específicos (não de-a):

public static class ListExtensions
{
   public static IEnumerable<TSource> ByIndexes<TSource>(this IList<TSource> source, params int[] indexes)
   {        
        if (indexes == null || indexes.Length == 0)
        {
            foreach (var item in source)
            {
                yield return item;
            }
        }
        else
        {
            foreach (var i in indexes)
            {
                if (i >= 0 && i < source.Count)
                    yield return source[i];
            }
        }
   }
}

Por exemplo:

string[] list = {"a1", "b2", "c3", "d4", "e5", "f6", "g7", "h8", "i9"};
var filtered = list.ByIndexes(5, 8, 100, 3, 2); // = {"f6", "i9", "d4", "c3"};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top