วิธีรับ Sublist ใน C #


91

ฉันมีList<String>และต้องการนำรายการย่อยออกจากรายการนี้ มีวิธีการใด ๆ ของ List สำหรับสิ่งนี้ใน. NET 3.5 หรือไม่?


คุณสามารถแสดงตัวอย่างโค้ดของสิ่งที่คุณมีหรือชี้แจงให้เราทราบได้ไหม ฉันไม่ได้ติดตามคำถาม
David

ฉันมีรายการพูดว่า List <String> list = new list <String> (); ฉันต้องการนำรายการย่อยออกจากรายการนี้โดยพูดจากดัชนี 2 ถึงความยาว -1 ..
โทมัสมานาลิล

คำตอบ:


131

คุณต้องการ 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 ปีก่อน หากคุณแก้ไขคุณจะได้รับเครดิตในอินเทอร์เน็ตยุติธรรมลีกแห่งความอวดรู้และจะได้รับอย่างดี
p.campbell

11
ฉัน ( เหมือนคนอื่น ๆ ) กำลังมองหาสิ่งที่คล้ายกับsubListจาก Java ซึ่งแสดงมุมมองที่ไม่แน่นอนในรายการต้นฉบับ สิ่งนี้มีลักษณะที่แตกต่างออกไปซึ่งอาจไม่ชัดเจนในทันทีดังนั้นฉันคิดว่าการชี้ให้เห็นจะเป็นประโยชน์สำหรับทุกคนที่เห็นสิ่งนี้ในภายหลัง นอกประเด็นคุณอาจต้องการเล่นโยคะหรือทำสมาธิหรืออะไรสักอย่าง คุณเป็น 0 จนหน้าแดงเป็นบ้าโดยไม่มีการยั่วยุใด ๆ
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 loop และส่งต่อออกไป

หรือให้วิธีการและลูปแก้ไขคอลเล็กชันที่มีอยู่โดยตั้งค่าแฟล็ก "กรอง" หรือ "ใช้งานอยู่" (คุณสมบัติ) สิ่งนี้สามารถใช้งานได้ แต่อาจทำให้เกิดปัญหาในโค้ดมัลติเธรด หากออบเจ็กต์อื่น ๆ อยู่บนเนื้อหาของคอลเล็กชันสิ่งนี้จะดีหรือไม่ดีขึ้นอยู่กับวิธีที่คุณใช้ข้อมูล


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.