Як отримати підзапис у C #


89

У мене є List<String>і мені потрібно вилучити з цього списку підсписок. Чи доступні для цього способи List для цього .NET 3.5?


Чи можете ви показати нам зразок коду того, що у вас є, або пояснити? Я не стежу за питанням.
Девід

У мене є список say List <String> list = new list <String> (); мені потрібно вилучити з цього списку
підзапис,

Відповіді:


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 Saeeduddin

@Asad Суть цієї відповіді полягала в тому, щоб продемонструвати, що OP може використовувати LINQ. Ви вказали, що це створює копію. Фантастичний. Ваші таланти, мабуть, можна було б краще використати при редагуванні цього питання, щоб проілюструвати суть ще точніше, ніж я залишив це 5,5 років тому. Якщо ви відредагуєте його, ви отримаєте кредит в Інтернет-лізі справедливості педантизму, і це буде добре зароблено!
Кемпбелл

10
Я ( як і деякі інші люди ) шукав щось подібне до subListJava, що відкриває змінне представлення до оригінального списку. Це поводиться по-різному, що може бути не відразу очевидним, тому я вважав, що було б корисно вказати на користь того, хто побачить це пізніше. Поза темою, можливо, вам захочеться зайнятися йогою, медитацією чи щось інше; ти зійшов нанівець з розуму без жодної провокації.
Asad Saeeduddin

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

тобто не потрібно дбати про відлік / довжину тощо.


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і вам потрібно отримати список записів між двома конкретними датами?
Джогі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.