1

木のオブジェができました。

EFacebookと呼ばれるプロパティを持つ非常に単純なオブジェクトid

class EFacebook
{
   public string id { get; set; }
}

A EUser、より複雑です。は内部EUserのリストを取得し、それぞれが型を取得します。お気に入り:EProviderEProvider

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; }
}

そして 2 つのリスト: (ユーザー内のプロバイダーのリストはオプションで、null 可能です):

// 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ここで、 との関係に基づいて の 2 つの子リストを取得する必要がfacebook.idありuser.eprovider(of enum facebook).idます。これは、タイプ2のプロバイダーを持つユーザーがいないため、2のEFacebookオブジェクトのみを含むリストと、タイプ2 のユーザーがいるために 1 と 3のオブジェクトを含むリストを意味します。そして1と3。facebookidfacebookidEFacebookfacebookidproviderfacebookidid

私はたくさん試しましたが、うまくいきません:

/*var xaa = users.Select(z => z.EProviders.Where(x => x.ProviderType == 
    EProvider.EnumProviderType.Facebook).Select(x => x.Ip).Zip(z);*/

/*var a = users.Select(x => x.EProviders.Where(y => y.ProviderType == 
    EProvider.EnumProviderType.Facebook));*/


/*
var outra = facebooks.Where(x=>                 
var a = from i in users
    where i.EProviders != null && i.EProviders.Any(j => j.ProviderType == 
    EProvider.EnumProviderType.Facebook)
from j in i.EProviders
join k in facebooks on j.Ip equals k.id
select k;

var b = facebooks.Except(a);
*/

どんな助けでも大歓迎です。

4

1 に答える 1

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
于 2012-04-12T16:18:17.720 に答える