如何将一个字符串列表的索引范围添加到另一字符串列表

时间:2019-01-04 22:43:59

标签: c# list

我是C#的新手,并将一些python重新编码为C#。您将如何选择一个列表(列表1)的范围并为其创建新的较短列表(列表2)?

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 :(得分:1)

这将等同于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

答案 1 :(得分:1)

首先,请注意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"]

答案 2 :(得分:1)

您可以使用GetRange的{​​{1}}方法执行此操作:

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 扩展方法LinqSkipTake):

using System.Linq

答案 3 :(得分:0)

您可以使用Array.Copy()方法。这将允许您将一个数组中指定范围的元素复制到另一个数组。

请参阅文档here