2016-04-10 20 views
7

Tôi có 2 List<object>. Cái đầu tiên, cho phép gọi nó là ListA giống như một danh sách đầy đủ và ListB thứ hai là một danh sách được sửa đổi. Bây giờ những gì tôi muốn làm là sửa đổi ListA với ListB. Điều này có thể thực hiện được không và tôi có thể làm như thế nào. Đây là những gì tôi có cho đến nay nhưng không hoạt động:C# Cập nhật Danh sách từ Danh sách Khác

var ListB = _repository.Get(m => m.Approved == true).ToList(); 
foreach (var x in ListB) 
{ 
    ListA.Where(d => d.Name == x.Name).First() = x; 
} 

return ListA; 

EDIT: Visual Presentation để mô tả những gì 'sửa đổi' có nghĩa là trong hoàn cảnh của tôi

ListA 
Id  Name  Age 
1  John  14 
2  Mark  15 
3  Luke  13 
4  Matthew 18 

ListB 
Id  Name  Age 
2  Mark  0 
4  Matthew 99 

Sau 'sửa đổi' nó, Lista nên nhìn như:

ListA 
Id  Name  Age 
1  John  14 
2  Mark  0 
3  Luke  13 
4  Matthew 99 
+2

Bạn sẽ phải xác định cái gì "sửa đổi" có nghĩa là trong trường hợp này –

+1

@SamiKuhmonen cảm ơn bạn, vui lòng xem chỉnh sửa của tôi. –

+0

tốt, bạn đang thay đổi ListA, nhưng bạn thực sự trả về ListB (từ cái nhìn nhanh) – ArielB

Trả lời

6

Khi tôi xem xét, bạn chỉ muốn cập nhật tuổi. Ngoài ra, bạn không cần sử dụng Where().First() bạn có thể sử dụng chỉ First().

foreach (var x in ListB) 
{ 
    var itemToChange = ListA.First(d => d.Name == x.Name).Age = x.Age; 
} 

Nếu bạn không chắc chắn, mục tồn tại trong ListA bạn nên sử dụng FirstOrDefault() và câu lệnh if để kiểm tra xem nó.

foreach (var x in ListB) 
{ 
    var itemToChange = ListA.FirstOrDefault(d => d.Name == x.Name); 
    if (itemToChange != null) 
     itemToChange.Age = x.Age; 
} 
+0

là có cách tôi có thể cập nhật tất cả các thuộc tính cùng một lúc, tôi có nghĩa là làm thế nào tôi có thể cập nhật nó một cái gì đó như 'itemToChange = x ', không thể? –

+0

@ siêu người dùng bạn phải triển khai phương pháp sao chép hoặc sao chép sâu, như mọi người khác đề xuất. – Valentin

+0

@ siêu người dùng nó không được khuyến khích, như thể bạn có một lớp như một thành viên dữ liệu - bạn sẽ làm một bản sao nông của nó có nghĩa là, 2 lớp khác nhau sẽ tham chiếu đến cùng một đối tượng. – ArielB

4

Nơi và lần đầu trả lại IEnumerable - bạn chỉ có thể sửa đổi nút của danh sách, nhưng không thể gán lại.

lựa chọn 0 - cách tiếp cận chung

using System.Collections.Generic; 

//... 

    var itemToUpdate = ListA.FirstOrDefault(d => d.Name == x.Name); 
    if (itemToUpdate != null) { 
     ListA[ListA.IndexOf(itemToUpdate)] = x; 
    } 

lựa chọn 1 - thực hiện các phương pháp cập nhật hoặc thực hiện cập nhật lĩnh vực bằng tay

ListA.First(d => d.Name == x.Name).Update(x); 
+0

Tôi nên tham khảo gì để sử dụng IndexOf() hoặc Update(), cả hai đều không hoạt động trên tôi –

+0

hãy gọi cho lớp của bạn mà bạn đang sử dụng trong danh sách "Người", chuyển đến lớp "Người" và thêm " Sao chép (Person p) "phương pháp. sau đó sử dụng bản sao nông/sâu cho đối tượng đó. và bạn đã hoàn tất. và không có IndexOf vì IEnumerable không có chỉ mục - đó là phương thức Danh sách (đảm bảo ListA thực sự là Danh sách) và Cập nhật là thứ bạn phải viết – ArielB

+0

IndexOf có trong List <> class và Update là một phương pháp mà bạn nên triển khai hoặc những người dùng khác đã viết - chỉ cần thay đổi trường Độ tuổi. Phương thức cập nhật sẽ có ích, nếu bạn có 10-20 trường. – aershov

3

để xây dựng câu trả lời aershov của:

ListA.Where(d => d.Name == x.Name).First().CopyFrom(x); 

sau đó trong bạn Lớp người:

public class Person 
{ 
    // ... Name, Id, Age properties... 

    public void CopyFrom(Person p) 
    { 
     this.Name = p.Name; 
     this.Id = p.Id; 
     this.Age = p.Age; 
    } 
} 

tất cả kiểm tra null và mọi thứ.

2

Bạn có thể xóa tất cả các thành phần của ListB từ ListA dựa trên Id, thêm ListB vào ListA và sau đó sắp xếp sử dụng Id.

var newlist = ListA.Where(s => !ListB.Any(p => p.Id == s.Id)).ToList(); 
newlist.AddRange(ListB); 
ListA = newlist.OrderBy(o => o.Id).ToList(); 
0

Bạn cũng có thể sử dụng phương pháp liên minh với một IEqualityComparer:

var newList = ListB.Union(ListA, new PersonEqualityComparer()); 

class PersonEqualityComparer : IEqualityComparer<Person> 
{ 
    public bool Equals(Person person1, Person person2) 
    { 
     if (person1 == null && person2 == null) 
      return true; 
     else if ((person1 != null && person2 == null) || 
       (person1 == null && person2 != null)) 
      return false; 

     return person1.Id.Equals(person2.Id); 
    } 

    public int GetHashCode(Person item) 
    { 
     return item.Id.GetHashCode(); 
    } 
} 
Các vấn đề liên quan