using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqExamples.examples
{
class LinqExample2 : IExample
{
private Role Role1 = new Role(){Id = 1,Name = "Role 1"};
private Role Role2 = new Role(){Id = 2, Name = "Role 2"};
private Role Role3 = new Role(){Id = 3, Name = "Role 3"};
private User User1 = new User() { Id = 1, Name = "User 1" };
private Account Account1 = new Account() { Id = 1, Name = "Account 1" };
List<userroleaccount> UserRoleAccountsList;
List<role> NewRoles;
public LinqExample2()
{
UserRoleAccountsList = new List<userroleaccount>()
{
new UserRoleAccount() {
Account = Account1,
Roles = new List<role>(){ Role1, Role2}
}
};
NewRoles = new List<role>() { Role1, Role3 };
}
public void ExecuteExample()
{
Console.WriteLine("Linq Example #2: Only adding new roles");
Console.WriteLine("========================================================");
var rolesToAdd = NewRoles.Except(UserRoleAccountsList.Where(x => x.Account.Id == Account1.Id).Select(x => x.Roles).FirstOrDefault());
foreach (var item in rolesToAdd)
{
Console.WriteLine("Role to add: {0}", item.Name);
}
var rolesIntersect = NewRoles.Intersect(UserRoleAccountsList.Where(x => x.Account.Id == Account1.Id).Select(x => x.Roles).FirstOrDefault());
foreach (var item in rolesIntersect)
{
Console.WriteLine("Role intersect {0}", item.Name);
}
var rolesUnion = NewRoles.Union(UserRoleAccountsList.Where(x => x.Account.Id == Account1.Id).Select(x => x.Roles).FirstOrDefault());
foreach (var item in rolesUnion)
{
Console.WriteLine("Role union {0}", item.Name);
}
}
}
class UserRoleAccount
{
public List<role> Roles { get; set; }
public Account Account { get; set; }
}
class User
{
public string Name { get; set; }
public long Id { get; set; }
}
class Role
{
public string Name { get; set;}
public long Id { get; set; }
}
class Account
{
public string Name { get; set; }
public long Id { get; set; }
}
}
[Sorry about the encoding, hopefully I'll figure out a better way to display generics soon]
As you can see from the above example, it is very easy to compare the NewRoles object to the list of roles already set in the UserRoleAccount object.
1) Except: displays all roles that are in NewRoles but not in the current role list
2) Intersect: displays all the roles that exist in both lists
3) Union: Does a join on the two lists. Does not display duplicates.
This is a far cry from the days of iterating over the lists or implementing custom comparator functions.
No comments:
Post a Comment