Какой самый компактный и / или эффективный способ извлечения нескольких (непоследовательных) значений из списка с помощью индексации - PullRequest
0 голосов
/ 11 июля 2019

У меня есть следующий список:

List<int> listOfInt = new List<int> {10, 20, 30, 40, 50};

Теперь мне дан список индексов, указывающих на значения, которые будут извлечены из listOfInt:

int[] idxList= new int[] { 2, 4, 1 };

Теперь я хочу извлечь все значения из listOfInt по индексу (согласно предоставленному idxList) в другой список.
Вот то, что я придумал, что, кажется, работает, но я хотел бы избавиться от этого цикла foreach. Как это может быть сделано?

List<int> newList= new List<int>();
foreach(var idx in idxList) newList.Add( listOfInt.ElementAt(idx) );

Решение:
{30, 50, 20} будут записаны в newList

Ответы [ 4 ]

3 голосов
/ 11 июля 2019

Ну, это зависит от того, можем ли мы добиться большей эффективности без цикла foreach?

foreach() получает счетчик и просматривает список. Любое другое решение, которое вы можете придумать, в конечном итоге должно будет сделать то же самое, потому что вам нужно обрабатывать каждый элемент в вашем списке индексов.

Так что нет, вы не можете сделать это более эффективным. Или, может быть, вы могли бы, если бы вы написали все требования и предположения, но никоим образом это не будет узким местом производительности вашего кода.

Циклы процессора дешевы. Краткий код является дорогим, как для написания, так и для чтения, из-за ментальных накладных расходов.

Вы можете использовать Linq, как показывает @Sohaib ниже, но это не будет заметно эффективнее.

1 голос
/ 11 июля 2019

Если вы хотите опустить foreach, вы можете использовать это:

var result = idxList.Select(i => listOfInt.ElementAt(i));
1 голос
/ 11 июля 2019

Короткий способ сделать это, используя Linq: idxList.Select(i => listOfInt[i]).ToList()

0 голосов
/ 11 июля 2019

Вы добавляете элементы в newList один за другим.Это создаст ненужные выделения памяти.Лучше дать новую подсказку List о результирующем размере.

var listOfInt = new List<int> { 10, 20, 30, 40, 50 };
var idxList = new [] { 2, 4, 1 };

var newList = new List<int>(idxList.Length);

for (int i = 0; i < idxList.Length; i++)
    newList[i] = listOfInt[idxList[i]];

Кроме того, цикл for имеет тенденцию быть быстрее, чем foreach при итерации по списку ( source ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...