2017-05-21 59 views
-1

我有一個名單<>公會包含一個列表<>用戶。兩種類型都有一個ID屬性。如何發現相互行會?

我想發現所有共享相同的公會爲自己的用戶(除一個問題,我們顯然會對股)

有一個聰明的LINQ和/或拉姆達技術來實現這一目標?

+0

你必須描述你對存儲行業協會和用戶至上?在數據庫中?在一個List <>中?如果是這樣如何? –

+0

List <>或者IReadOnlyCollection <>具體爲 – Amivit

+0

與你自己一樣的公會嗎?或者他們可以在更少/更多的行會中? – DigiFriend

回答

2

你的問題很不清楚。儘管如此,我還是對它進行了一次嘗試。如果我明白正確:

你有一個類,它看起來是這樣的:

public class Guild 
{ 
    public List<User> Users; 
    public int ID; 
} 

和兩個名單:

var guilds = new List<Guild>(); 
var myGuilds = new List<Guild>(); 

,你想要什麼是所有行會的所有用戶,你也是一部分。您可以使用此:

var guildUsers = new HashSet<User>((from first in guilds 
            join second in myGuilds 
            on first.ID equals second.ID 
            select first.Users).SelectMany(x => x)).ToList(); 

我們在這裏做的是以下幾點:

拳頭,我們相交基於ID的兩個列表,我們選擇各自Users名單:

from first in guilds 
join second in myGuilds 
on first.ID equals second.ID 
select first.Users 

然後,我們使用SelectMany來列舉枚舉列表:

.SelectMany(x => x) 

然後,我們將所有這些包裝在HashSet中以刪除重複的用戶(在多個公會中的用戶)。

最後,我們將HashSet轉換爲List<User>(可選)。

1

內評論:

public List<User> FindSimilarUsers(List<Guild> lGuilds, List<Guild> MyGuilds) 
    { 
     // phase 1: map user to his guilds 
     Dictionary<int, List<int>> dUserToGuilds = new Dictionary<int, List<int>>(); 
     lGuilds.ForEach(guild => guild.Users.ForEach(user => dUserToGuilds[user.ID] = new List<int>())); 
     lGuilds.ForEach(guild => guild.Users.ForEach(user => dUserToGuilds[user.ID].Add(guild.ID))); 

     // phase 2: map user id to corresponding user object 
     Dictionary<int, User> dUsers = new Dictionary<int, User>(); 
     lGuilds.ForEach(guild => guild.Users.ForEach(user => dUsers[user.ID] = user)); 

     // phase 3: find similar users 
     List<int> MyGuildsIds = MyGuilds.Select(guild => guild.ID).ToList(); 
     return dUserToGuilds.Keys.ToList().Where(user_id => dUserToGuilds[user_id].Intersect(MyGuildsIds).Count() > 1).Select(user_id => dUsers[user_id]).ToList(); 
    } 

以及測試:

static void Main(string[] args) 
    { 
     List<Guild> lGuilds = new List<Guild>(); 
     List<Guild> MyGuilds = new List<Guild>(); 

     User u1 = new User { ID = 1 }; 
     User u2 = new User { ID = 2 }; 
     User u3 = new User { ID = 3 }; 
     User u4 = new User { ID = 4 }; 
     Guild g1 = new Guild { ID = 1, Users = new List<User>() { u1, u2, u4 } }; 
     Guild g2 = new Guild { ID = 2, Users = new List<User>() { u1, u3, u4 } }; 
     Guild g3 = new Guild { ID = 3, Users = new List<User>() { u2, u4 } }; 
     lGuilds.Add(g1); 
     lGuilds.Add(g2); 
     lGuilds.Add(g3); 
     MyGuilds.Add(g1); 
     MyGuilds.Add(g2); 

     FindSimilarUsers(lGuilds, MyGuilds).ForEach(user => Console.WriteLine(user.ID)); 

     // output: 
     // 1 
     // 4 
    }