Làm thế nào để bạn nối các danh sách trong C #?


170

Nếu tôi có:

List<string> myList1;
List<string> myList2;

myList1 = getMeAList();
// Checked myList1, it contains 4 strings

myList2 = getMeAnotherList();
// Checked myList2, it contains 6 strings

myList1.Concat(myList2);
// Checked mylist1, it contains 4 strings... why?

Tôi đã chạy mã tương tự như thế này trong Visual Studio 2008 và đặt điểm dừng sau mỗi lần thực thi. Sau đó myList1 = getMeAList();, myList1chứa bốn chuỗi và tôi nhấn nút dấu cộng để đảm bảo chúng không phải là tất cả.

Sau đó myList2 = getMeAnotherList();, myList2chứa sáu chuỗi và tôi đã kiểm tra để đảm bảo chúng không rỗng ... Sau myList1.Concat(myList2);myList1 chỉ chứa bốn chuỗi. Tại sao vậy?

Câu trả lời:



96

Thử cái này:

myList1 = myList1.Concat(myList2).ToList();

Concat trả về một <T> IEn là hai danh sách được đặt cùng nhau, nó không sửa đổi danh sách hiện có. Ngoài ra, vì nó trả về một IEnumerable, nếu bạn muốn gán nó cho một biến là List <T>, bạn sẽ phải gọi ToList () trên IEnumerable <T> được trả về.


6
Bây giờ tôi đọc lại câu hỏi, .AddRange () nghe có vẻ giống như những gì OP thực sự muốn.
Jonathan Rupp

@Kartiikeya nếu nói rằng các đối số không hợp lệ, bạn không có câu lệnh sử dụng cho System.Linq hoặc một trong số đó không phải làIEnumerable<T>
Jonathan Rupp

12
targetList = list1.Concat(list2).ToList();

Tôi nghĩ nó hoạt động tốt. Như đã nói trước đây, Concat trả về một chuỗi mới và trong khi chuyển đổi kết quả thành Danh sách, nó thực hiện công việc một cách hoàn hảo.


4

Cũng đáng lưu ý rằng Concat hoạt động trong thời gian liên tục và trong bộ nhớ không đổi. Ví dụ: đoạn mã sau

        long boundary = 60000000;
        for (long i = 0; i < boundary; i++)
        {
            list1.Add(i);
            list2.Add(i);
        }
        var listConcat = list1.Concat(list2);
        var list = listConcat.ToList();
        list1.AddRange(list2);

đưa ra các số liệu thời gian / bộ nhớ sau đây:

After lists filled mem used: 1048730 KB
concat two enumerables: 00:00:00.0023309 mem used: 1048730 KB
convert concat to list: 00:00:03.7430633 mem used: 2097307 KB
list1.AddRange(list2) : 00:00:00.8439870 mem used: 2621595 KB

2

Tôi biết điều này đã cũ nhưng tôi đã nhận được bài đăng này một cách nhanh chóng nghĩ rằng Concat sẽ là câu trả lời của tôi. Liên minh đã làm việc tuyệt vời cho tôi. Lưu ý, nó chỉ trả về các giá trị duy nhất nhưng biết rằng tôi đã nhận được các giá trị duy nhất dù sao giải pháp này hiệu quả với tôi.

namespace TestProject
{
    public partial class Form1 :Form
    {
        public Form1()
        {
            InitializeComponent();

            List<string> FirstList = new List<string>();
            FirstList.Add("1234");
            FirstList.Add("4567");

            // In my code, I know I would not have this here but I put it in as a demonstration that it will not be in the secondList twice
            FirstList.Add("Three");  

            List<string> secondList = GetList(FirstList);            
            foreach (string item in secondList)
                Console.WriteLine(item);
        }

        private List<String> GetList(List<string> SortBy)
        {
            List<string> list = new List<string>();
            list.Add("One");
            list.Add("Two");
            list.Add("Three");

            list = list.Union(SortBy).ToList();

            return list;
        }
    }
}

Đầu ra là:

One
Two
Three
1234
4567

2

Hãy xem thực hiện của tôi. Nó an toàn từ danh sách null.

 IList<string> all= new List<string>();

 if (letterForm.SecretaryPhone!=null)// first list may be null
     all=all.Concat(letterForm.SecretaryPhone).ToList();

 if (letterForm.EmployeePhone != null)// second list may be null
     all= all.Concat(letterForm.EmployeePhone).ToList(); 

 if (letterForm.DepartmentManagerName != null) // this is not list (its just string variable) so wrap it inside list then concat it 
     all = all.Concat(new []{letterForm.DepartmentManagerPhone}).ToList();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.