2017-01-03 7 views
1

申し訳ありません質問のタイトルが混乱している場合は、私は2つのクラスのユーザーと住所があるシナリオを持っています。リストのアイテムを別のリストのIDで取得する

public class User 
{ 
    public int userId { get; set; } 
    public string userName { get; set; } 

    public List<Address> address { get; set; } 
} 

public class Address 
{ 
    public string AddressLine { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 

    public int UserId { get; set; } 
} 

ユーザーIDは、クラスのアドレスの外部キーは、私は2つのリスト、ユーザーのリストやアドレスのリストを持っています。ユーザーのアドレスの値がnullの場合、各ユーザーのアドレス一覧を取得したいのですが、どのように達成できますか?私はforeachを使うことができると知っていますが、linqがこれを達成する方法はありますか?以下はサンプルコードです。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var users = new List<User>(); 
     users.Add(new User { userId = 1, userName = "User 1" }); 
     users.Add(new User { userId = 2, userName = "User 2" }); 
     users.Add(new User { userId = 3, userName = "User 3" }); 
     users.Add(new User { userId = 4, userName = "User 4" }); 

     var address = new List<Address>(); 
     address.Add(new Address { AddressLine = "Address 1", City = "City 1", State = "State 1", UserId = 1 }); 
     address.Add(new Address { AddressLine = "Address 1 Dup", City = "City 1", State = "State 1", UserId = 1 }); 
     address.Add(new Address { AddressLine = "Address 2", City = "City 2", State = "State 2", UserId = 2 }); 
     address.Add(new Address { AddressLine = "Address 2 Dup", City = "City 2", State = "State 2", UserId = 2 }); 
     address.Add(new Address { AddressLine = "Address 3", City = "City 3", State = "State 3", UserId = 3 }); 
     address.Add(new Address { AddressLine = "Address 3 Dup", City = "City 3", State = "State 3", UserId = 3 }); 


    } 
} 
+5

ちょうどノートでは...私は可能であればそれを修正することを検討します。アドレス付きのユーザーIDを格納するのは悪い設計です。 2人のユーザーが同じ住所に住んでいる場合はどうなりますか?実際には多対多の関係、つまりユーザーIDと住所IDを持つ中間テーブルを格納する必要があります。 –

+0

これは単なる例です。元のコードを投稿することはできません。それはセキュリティの違反ですので、私は親切なダミーデータを作成しました。私はこのスキーマ設計が間違っていることに同意する。 –

+0

LINQはforeachも使用します。 [ここをクリック](https://referencesource.microsoft.com/) – Badiparmagi

答えて

3

Linqバージョン

List<User> result = users.Select(x => 
         new User() { 
          userId = x.userId, 
          userName = x.userName, 
          address = address.Where(y => y.UserId == x.userId).ToList() 
         }).ToList(); 

芋より読みforeachバージョン

foreach (User user in users) 
    user.address = address.Where(y => y.UserId == user.userId).ToList(); 
+0

答えてくれてありがとう、申し訳ありませんが、これは愚かな質問ですが、代わりにlinq foreachを使用する場合、それは遅くなるか高速ですか?どの方が良いでしょうか、Linq Foreachですか?このような何かusers.ForEach(t => t.address = address.Where(a => a.UserId == t.userId).ToList()); –

+1

これについても注意が必要です。これは 'User'のコピーを作成し、派生リストの各' User'への変更は実際の 'User'に影響を与えません。それはあなたが望むものかもしれません。 'linq'の使用は常に遅くなります。 – Bauss

+0

あなたは選択がより速くなることを意味しますか?私はそれが要件であるので、実際のユーザーを変更することで大丈夫です。 –

1

それはSelectWhereとかなり簡単です。

users = users.Select(u => { u.address = address.Where(a => a.UserId == u.userId).ToList(); return u; }).ToList(); 

より読みやすいバージョン:あなたのスキーマについて

users = users.Select(u => 
    { 
     u.address = address.Where(a => a.UserId == u.userId).ToList(); 

     return u; 
    }).ToList(); 
関連する問題