我有一個名單<>公會包含一個列表<>用戶。兩種類型都有一個ID屬性。如何發現相互行會?
我想發現所有共享相同的公會爲自己的用戶(除一個問題,我們顯然會對股)
有一個聰明的LINQ和/或拉姆達技術來實現這一目標?
我有一個名單<>公會包含一個列表<>用戶。兩種類型都有一個ID屬性。如何發現相互行會?
我想發現所有共享相同的公會爲自己的用戶(除一個問題,我們顯然會對股)
有一個聰明的LINQ和/或拉姆達技術來實現這一目標?
你的問題很不清楚。儘管如此,我還是對它進行了一次嘗試。如果我明白正確:
你有一個類,它看起來是這樣的:
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>
(可選)。
內評論:
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
}
你必須描述你對存儲行業協會和用戶至上?在數據庫中?在一個List <>中?如果是這樣如何? –
List <>或者IReadOnlyCollection <>具體爲 – Amivit
與你自己一樣的公會嗎?或者他們可以在更少/更多的行會中? – DigiFriend