Как добавить диапазон индексов одного списка строк в другой список строк - PullRequest
0 голосов
/ 05 января 2019

Я новичок в c # и перекодирую некоторый питон в c #. Как бы вы взяли диапазон из одного списка (list1) и создали бы его более короткий список (list2)?

python
list1= ["lets", "go", "visit", "houston", "texas"]
list2 = []
list2.append(list1[3:4]) ##new list is ["houston", "texas"]
#or
list2.append(list1[3:]) ##new list is ["houston", "texas"]

Как бы это выглядело в c #?

private void button1_Click(object sender, EventArgs e)
    {
        List < string > list1 = new List < string > ();
        list1.Add("lets");
        list1.Add("go");
        list1.Add("visit")
        list1.Add("houston");
        list1.Add("texas");

        List<string> list2 = list1.GetRange(3, 4);
    }

Есть ли лучший способ получить диапазоны индекса списка? И как начать индекс, list1 [: 3] или индекс до конца list1 [3:]

Ответы [ 4 ]

0 голосов
/ 05 января 2019

Вы можете сделать это, используя GetRange метод List<T>:

List<string> list2 = list1.GetRange(3, 2); // Take two items starting at index 3
List<string> list2 = list1.GetRange(0, 3); // Take from the beginning up to index 3
List<string> list2 = list1.GetRange(3, list1.Count - 3); // Take from index 3 to the end

Или, альтернативно, с помощью методов расширения Linq Skip и Take (using System.Linq):

List<string> list2 = list1.Skip(3).Take(2).ToList(); // Take two items starting at index 3
List<string> list2 = list1.Take(3).ToList(); // Take from the beginning up to index 3
List<string> list2 = list1.Skip(3).ToList(); // Take from index 3 to the end
0 голосов
/ 05 января 2019

Во-первых, обратите внимание, что GetRange определяется как:

System.Collections.Generic.List<T> GetRange (int index, int count);
  • Где index - это индекс List<T>, начинающийся с нуля, при котором диапазон начинается.
  • count - количество элементов в диапазоне.

Таким образом, выполнение list1.GetRange(3, 4); приведет к System.ArgumentException:, так как count, т.е. 4 не обозначает допустимый диапазон элементов в списке.

Кроме того, использование GetRange так же хорошо, как и если вы хотите скопировать определенный диапазон списка.

Чтобы получить список, содержащий «Хьюстон» и «Техас», вы можете вызвать GetRange с 3 в качестве индекса и 2 в качестве количества элементов.

list1.GetRange(3, 2); // ["houston", "texas"]

К сожалению, GetRange не берет только "начальный индекс".

Вместо этого, если вы не хотите указывать Count в GetRange, тогда используйте Skip и собирайте в список:

list1.Skip(3).ToList(); // ["houston", "texas"]

Либо, если вы хотите добавить в «существующий» список, используйте AddRange + GetRange:

list2.AddRange(list1.GetRange(3, 2)); // ["houston", "texas"]
0 голосов
/ 05 января 2019

Вы можете использовать метод Array.Copy (). Это позволит вам скопировать указанный диапазон элементов в одном массиве в другой массив.

См. Документацию здесь .

0 голосов
/ 05 января 2019

Это будет эквивалент C #:

var list1 = new List<string> { "lets", "go", "visit", "houston", "texas" };
var list2 = new List<string>();
list2.AddRange(list1.Skip(3).Take(2 /* there is 2 elements from 3rd to 4th*/));
// or
list2.AddRange(list1.Skip(3));

Редактировать: Вы можете расширить список с помощью пользовательских методов:

public static class ListExtensions
{
    public static List<T> Slice<T>(this List<T> list, int? start = null, int? end = null)
    {
        if (start.HasValue)
            return list.GetRange(start.Value, (end.HasValue ? (end.Value + 1) : list.Count) - start.Value);
        if (end.HasValue) // not sure [:n] returns last n elements?
            return list.GetRange(list.Count - end.Value, end.Value);

        return list;
    }
}

var list1 = new List<string> { "lets", "go", "visit", "houston", "texas" };
list1.Slice(3) // houston, texas 
list1.Slice(3, 4) // houston, texas
list1.Slice(null, 3) // visit, houston, texas
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...