// 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);
}
Это копия сегмента исходного списка, а не представление части исходного списка.
Асад Саидуддин
@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» - это объект, который находится в списке. Итак, если вы использовали объект данных, то есть:
publicclassClient
{
publicstring 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)){}
т.е. не нужно заботиться о количестве / длине и т. д.
У вашего класса коллекции может быть метод, который возвращает коллекцию (подсписок) на основе критериев, переданных для определения фильтра. Создайте новую коллекцию с помощью цикла 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));
Ответы:
Вам нужен 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); }
источник
Было бы так же просто, как выполнить запрос LINQ в вашем списке?
List<string> mylist = new List<string>{ "hello","world","foo","bar"}; List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();
источник
subList
Java, которое предоставляет изменяемое представление в исходный список. Это ведет себя по-другому, что может быть не сразу очевидно, поэтому я подумал, что было бы полезно указать на это для пользы всех, кто увидит это позже. Не по теме, возможно, вы захотите заняться йогой или медитацией или чем-то еще; Вы без всякой провокации сошли с ума до красного в лицо.Используйте предложение 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");
источник
С 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)){}
т.е. не нужно заботиться о количестве / длине и т. д.
источник
У вашего класса коллекции может быть метод, который возвращает коллекцию (подсписок) на основе критериев, переданных для определения фильтра. Создайте новую коллекцию с помощью цикла 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
источник
Range
верно для целого типа данных. что, если ваш тип данных -DataTime
и вам нужно получить список записей между двумя конкретными датами?