我有树对象。
一个对象EFacebook
,非常简单,有一个名为id
的属性。
class EFacebook
{
public string id { get; set; }
}
A EUser
,更复杂。 EUser
获取内部EProvider
列表,每个EProvider
获取一个类型。像:
class EUser
{
public string name { get; set; }
public List<EProvider> EProviders { get; set; }
}
class EProvider
{
public enum EnumType
{
facebook = 1,
twitter = 2
}
public string id { get; set; }
public EnumType type { get; set; }
}
两个列表:(提供者列表,内部用户,是可选的,可以为空):
// list of facebooks
List<EFacebook> facebooks = new List<EFacebook>();
facebooks.Add(new EFacebook { id = "1" });
facebooks.Add(new EFacebook { id = "2" });
facebooks.Add(new EFacebook { id = "3" });
// list of users
List<EUser> users = new List<EUser>();
List<EProvider> ps1 = new List<EProvider>();
ps1.Add(new EProvider { id = "1", type = EProvider.EnumType.facebook });
ps1.Add(new EProvider { id = "2", type = EProvider.EnumType.twitter });
List<EProvider> ps2 = new List<EProvider>();
ps2.Add(new EProvider { id = "3", type = EProvider.EnumType.facebook });
ps2.Add(new EProvider { id = "4", type = EProvider.EnumType.twitter });
EUser u1 = new EUser { name = "somea", EProviders = ps1 };
EUser u2 = new EUser { name = "someb", EProviders = ps2 };
EUser u3 = new EUser { name = "somec" };
users.Add(u1);
users.Add(u2);
users.Add(u3);
现在,我需要根据facebooks
和facebook.id
之间的关系获取两个user.eprovider(of enum facebook).id
子列表。这意味着,EFacebook
的列表仅包含facebook
id
2的对象,因为我没有具有类型facebook
和{{1}的提供者的用户2,以及包含id
{1}}和{1}的对象的EFacebook
列表,因为我的用户facebook
类型为id
和provider
1和facebook
3。
我尝试了很多,但它不起作用:
id
任何帮助将不胜感激。
答案 0 :(得分:2)
怎么样:
// Create an enumerable of all IDs of Facebook providers from the users list
var facebookIds = users
// Exclude all users with a null EProviders list
.Where(u => u.EProviders != null)
// For each user, select all EProviders with type == facebook
// and use SelectMany to flatten them into a single enumerable
.SelectMany(u => u.EProviders.Where(p => p.type == EProvider.EnumType.facebook));
// Use Join to find all facebooks whose IDs also exist in the facebookIds set constructed above
var facebooksWithUsers = facebooks.Join(facebookIds, f => f.id, p => p.id, (f, p) => f);
// Use Except to find the opposite subset
var facebooksWithoutUsers = facebooks.Except(facebooksWithUsers);
// Write the contents of the two sets to the console
Console.WriteLine("facebooksWithUsers:");
foreach (var fb in facebooksWithUsers)
{
Console.WriteLine(fb.id);
}
Console.WriteLine();
Console.WriteLine("facebooksWithoutUsers:");
foreach (var fb in facebooksWithoutUsers)
{
Console.WriteLine(fb.id);
}
输出:
facebooksWithUsers: 1 3 facebooksWithoutUsers: 2