2016-04-10 2 views
7

私は2 List<object>を持っています。最初の1つは、それをListAと呼ぶことができます。リストAは完全なリストに似ていて、もう1つはリストBです。今私がしたいのはListAでListAを変更することです。これは実践的なことであり、どうやってそれを行うことができますか?これは私がこれまで持っているものですが、動作しません: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:ビジュアルプレゼンテーションは、「変更」かを説明するためには、それを「修正」の後私の状況

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 

手段、LISTAが見えるはずですlike:

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

あなたは –

+1

@SamiKuhmonenはあなたに感謝し、この場合には、私の編集を参照してください何を意味するのか、「変更」を定義する必要があります。 –

+0

よくListAを変更していますが、ListBを実際に返しました(クイックルックから) – ArielB

答えて

6

私は、年齢のみを更新したいと考えています。また、Where().First()を使用する必要はありません。ちょうどFirst()を使用できます。

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

あなたがわからない場合、その項目は、あなたがそれをチェックするためにFirstOrDefault()とif文を使用する必要がありますListAに存在します。

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

私は一度にすべてのプロパティを更新する方法があります、どうすれば 'itemToChange = x '、不可能?誰もがお勧めとしてあなたは、コピーや深いコピーメソッドを実装する必要がスーパユーザ@ –

+0

。 – Valentin

+0

@ super-userデータメンバとしてクラスを持っているかのように、それはお勧めできません。それは意味の浅いコピーを意味し、2つの異なるクラスは同じオブジェクトを参照します。 – ArielB

4

ここで、最初にIEnumerableを返します。リストのノードのみを変更できますが、再割り当てはできません。

オプション0 - 一般的なアプローチ

using System.Collections.Generic; 

//... 

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

オプション1 - aershovの答え詳しく説明するためにupdateメソッドを実装するか、手動で

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

IndexOf()またはUpdate()を使用するにはどうすればいいですか両方で動作しません –

+0

"Person"というリストで使用しているクラスを呼び出し、 "Person"クラスに移動して "コピー(Person p)」メソッド。そのオブジェクトに浅い/深いコピーを使用します。あなたは終わった。 とIEnumerableをはのインデックスを持っていないので、何のIndexOfメソッドはありません - それはリスト方式です(LISTAが本当にリストであることを確認してください)、およびUpdateは – ArielB

+0

IndexOfメソッドを記述する必要がありますものです<リストのためにそこに>クラスで、更新がありますメソッド、実装する必要がある、または他のユーザーが書き込んだ - Ageフィールドを変更するだけです。更新方法は、10〜20個のフィールドがある場合に便利です。項目が見つからない場合 – aershov

3

フィールドの更新を行います。あなたには、その後

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

をPersonクラス:

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

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

もちろん、nullとすべてをチェックします。

2

あなたはListAにListBのを追加し、ソートIdを使用して、Idに基づいてListAからListBのすべての要素を削除することができます。

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

また、された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(); 
    } 
} 
関連する問題