How to Get a Sublist in C#

I have a List<String> and i need to take a sublist out of this list. Is there any methods of List available for this in .NET 3.5?

133088 次浏览

你想要 List::GetRange(firstIndex, count)

// I have a List called list
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9)
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3)

这就是你想要的吗?

如果您希望从原始列表中删除子列表项,那么您可以执行以下操作:

// list is our original list
// sublist is our (newly created) sublist built from GetRange()
foreach (Type t in sublist)
{
list.Remove(t);
}

它是否像在列表中运行 LINQ 查询那样简单?

List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();

使用 LINQ 中的 Where 子句:

List<object> x = new List<object>();
x.Add("A");
x.Add("B");
x.Add("C");
x.Add("D");
x.Add("B");


var z = x.Where(p => p == "A");
z = x.Where(p => p == "B");

在上面的语句中,“ p”是列表中的对象。所以如果你使用一个数据对象,比如:

public class Client
{
public string Name { get; set; }
}

那你的林克就会变成这样:

List<Client> x = new List<Client>();
x.Add(new Client() { Name = "A" });
x.Add(new Client() { Name = "B" });
x.Add(new Client() { Name = "C" });
x.Add(new Client() { Name = "D" });
x.Add(new Client() { Name = "B" });


var z = x.Where(p => p.Name == "A");
z = x.Where(p => p.Name == "B");

您的集合类可以具有一个方法,该方法根据传递来定义筛选器的条件返回集合(子列表)。使用 foreach 循环构建一个新集合并将其分发出去。

或者,通过设置“筛选”或“活动”标志(属性) ,让方法和循环修改现有集合。这种方法可以工作,但也可能在多线程代码中导致问题。如果其他对象取决于集合的内容,这取决于您如何使用数据。

反转子列表中的项

int[] l = {0, 1, 2, 3, 4, 5, 6};
var res = new List<int>();
res.AddRange(l.Where((n, i) => i < 2));
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse());
res.AddRange(l.Where((n, i) => i > 4));

给出0,1,4,3,2,5,6

和 LINQ 一起:

List<string> l = new List<string> { "1", "2", "3" ,"4","5"};
List<string> l2 = l.Skip(1).Take(2).ToList();

如果需要 foreach,则不需要 ToList:

foreach (string s in l.Skip(1).Take(2)){}

Advantage of LINQ is that if you want to just skip some leading element,you can :

List<string> l2 = l.Skip(1).ToList();
foreach (string s in l.Skip(1)){}

也就是说,不需要注意计数/长度等。