Как получить подсписок в C #

89

У меня есть, List<String>и мне нужно удалить подсписок из этого списка. Есть ли для этого какие-либо методы List в .NET 3.5?

Томас Маналил
источник
Можете ли вы показать нам образец кода того, что у вас есть, или уточнить? Я не слежу за вопросом.
Дэвид
У меня есть список: List <String> list = new list <String> (); мне нужно взять подсписок из этого списка, скажем, от индекса 2 до длины-1 ..
Томас Маналил

Ответы:

129

Вам нужен 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
Слагстер; Я повторяю список «b» при удалении из списка «a». Это законно :)
Джош
6

Было бы так же просто, как выполнить запрос LINQ в вашем списке?

List<string> mylist = new List<string>{ "hello","world","foo","bar"};
List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();
П. Кэмпбелл
источник
1
Это копия сегмента исходного списка, а не представление части исходного списка.
Асад Саидуддин
@Asad Цель этого ответа заключалась в том, чтобы проиллюстрировать, что OP может использовать LINQ. Вы указали, что он создает копию. Фантастика. Ваши таланты, вероятно, можно было бы лучше использовать при редактировании этого вопроса, чтобы проиллюстрировать суть вопроса даже лучше, чем я оставил его 5,5 лет назад. Если вы его отредактируете, вы получите признание педантизма в лиге интернет-правосудия, и оно будет хорошо заработано!
p.campbell
10
Я ( как и некоторые другие люди ) искал что-то похожее на subListJava, которое предоставляет изменяемое представление в исходный список. Это ведет себя по-другому, что может быть не сразу очевидно, поэтому я подумал, что было бы полезно указать на это для пользы всех, кто увидит это позже. Не по теме, возможно, вы захотите заняться йогой или медитацией или чем-то еще; Вы без всякой провокации сошли с ума до красного в лицо.
Асад Саидуддин
3

Используйте предложение Where из LINQ:

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

т.е. не нужно заботиться о количестве / длине и т. д.

jw_
источник
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верно для целого типа данных. что, если ваш тип данных - DataTimeи вам нужно получить список записей между двумя конкретными датами?
Jogi