如何在C#中获取子列表


89

我有一个List<String>,我需要从此列表中删除一个子列表。.NET 3.5中是否有可用的List方法?


您可以向我们展示您所拥有的代码示例,还是进行澄清?我没有关注这个问题。
David

我有一个列表说List <String> list = new list <String>(); 我需要从索引2取子表了这个名单发言权长度-1 ..
托马斯Manalil

Answers:


128

您想要List :: GetRange(firstIndex,count)。请参阅http://msdn.microsoft.com/en-us/library/21k0e39c.aspx

// 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);
}

4
在使用foreach遍历项目时,无法从列表中删除项目。
slugster,2009年

ug 我正在迭代列表'b',同时从列表'a'中删除。这是合法的:)
乔什(Josh)2009年

6

就像在您的列表上运行LINQ查询一样简单吗?

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

1
这是原始列​​表分段的副本,而不是原始列表一部分的视图。
Asad Saeeduddin

@Asad这个答案的重点是说明OP可以使用LINQ。您已经指出它将创建一个副本。太棒了 您的才能也许可以更好地用于编辑此问题,以说明这一点,甚至比我5.5年前留下的要好。如果您对其进行编辑,您将在pedantry的互联网正义联盟中获得声誉,并且将获得丰厚的收入!
p.campbell 2015年

10
我(和其他人一样)一直在寻找与subListJava类似的东西,它将Java的可变视图公开到原始列表中。这样做的行为有所不同,这可能不会立即显现出来,因此我认为指出这一点将对以后看到它的人有所帮助。不在主题上,您可能想参加瑜伽或冥想之类的事情;您毫无生气地将0变成了脸红。
Asad Saeeduddin

3

使用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; }
}

那么您的linq看起来像这样:

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");

详细说明之后,请使用我的第一个示例并添加以下内容:z = x.GetRange(1,3); x.RemoveRange(1,3); x.AddRange(z.OrderByDescending(p => p));
slugster,2009年

2

使用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)){}

LINQ的优点是,如果您只想跳过一些前导元素,则可以:

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

即,无需照顾计数/长度等。


0

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

或者,让方法和循环通过设置“已过滤”或“活动”标志(属性)来修改现有集合。这可能有效,但也可能导致多线程代码出现问题。如果在集合的内容上使用了其他对象,那么根据您使用数据的方式,这是好是坏。


0

反转子列表中的项目

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


Range对于整数数据类型为true。如果您的数据类型是,DataTime并且您需要检索两个特定日期之间的记录列表怎么办?
Jogi,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.