我是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:]
答案 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
扩展方法Linq
和Skip
(Take
):
using System.Linq
答案 3 :(得分:0)
您可以使用Array.Copy()方法。这将允许您将一个数组中指定范围的元素复制到另一个数组。
请参阅文档here。