我有一个List<String>
,我需要从这个列表中取一个子列表。在.NET 3.5中是否有可用于此的List方法?
答案 0 :(得分:95)
你想要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);
}
答案 1 :(得分:5)
是否像在List上运行LINQ查询一样简单?
List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();
答案 2 :(得分: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");
答案 3 :(得分:0)
您的集合类可以有一个方法,该方法根据传入的条件返回集合(子列表)以定义过滤器。使用foreach循环构建一个新集合并将其传递出去。
或者,让方法和循环通过设置“过滤”或“活动”标志(属性)来修改现有集合。这个可以工作,但也可能导致多线程代码中的问题。如果其他对象取决于集合的内容,这取决于您使用数据的方式是好还是坏。
答案 4 :(得分: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
答案 5 :(得分:0)
使用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)){}
即无需照顾计数/长度等。