c# - 我可以一次合并这两个列表吗

标签 c# linq

我想做什么,

// get members from SharePoint list (can be null)
// get members from database (can be null)
// merge database members with sharepoint list members BUT only database members should have property VIP = true
// by merge I mean if they are not in list then add them to list, if they are in list then just change there property VIP = true
// by default VIP property is false

到目前为止我开发了什么,

List<Member> Members = new List<Member>();
        foreach (SPListItem mItem in GetList(Url).Items)
        {
            Member m = new Member();
            m.ID = mItem.ID;
            m.Name = mItem.Title;
            m.Company = Utilities.ObjectToStringOrEmpty(mItem[companyCol]);
            m.eMail = Utilities.ObjectToStringOrEmpty(mItem[emailCol]);
            m.Comment = Utilities.ObjectToStringOrEmpty(mItem[commentCol]);
            m.Membership = Utilities.ObjectToStringOrEmpty(mItem[msCol]);
            Members.Add(m);
        }

        var cd = new MemberManager().GetMoreMembers(Url + "/");
        var activeMembers = cd.Where(am => am.MembershipStatus == "Active" || am.MembershipStatus == "Pending").ToList();
        if (activeMembers != null || activeMembers.Count() > 0)
        {
            foreach (var am in activeMembers)
            {
                if (!Members.Any(a => a.eMail.ToLowerInvariant() == am.Email.ToLowerInvariant()))
                {
                    Member m = new Member();
                    m.Name = am.FirstName + " " + am.LastName;
                    m.eMail = am.Email;
                    m.IsVip = true;
                    Members.Add(m);
                }
            }
        }

        md.Members = Members.ToArray();

问题

我可以使用 Linq 一次性合并这些列表吗?也许像这样,伪将是

var dbMembers = //GetDBMembers that are active or pending

var spMembers = 
              Select all members using `.Cast<SPListItem>()`
              If spMembers has any dbMember (compared by email)
              Then change that spMembers VIP property to true (which is by default false)
              For rest dbMembers that doesn't exists in spMembers, add them with VIP property = true

不确定如何有效地将上面的伪代码放入 linq

最佳答案

试试这个:

var allSpMembers = GetSpList(); // get your members as you mentioned before by `.Cast<SPListItem>()`

List<SPListItem> spMembers =
    dbMembers.GroupJoin(allSpMembers, dbM => dbM.Email, spM => spM.Email,
        (dbMember, spMember) => new { dbMember, spMember })
             .SelectMany(x => x.spMember.DefaultIfEmpty(), (x, spMember) =>
                 {
                     SPListItem yourSpListItem;

                     if (spMember != null)
                     {
                         yourSpListItem = spMember;
                     }
                     else
                     {
                         yourSpListItem = x.dbMember; //make some mapping here to SPListItem model
                     }

                     yourSpListItem.VIP = true;

                     return yourSpListItem;
                 }).ToList();

关于c# - 我可以一次合并这两个列表吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33142542/

相关文章:

c# - Enumerable.Repeat with Union and Take 不返回 'Take' 值

c# - 使用 Thread.Sleep 时如何更新 UI

c# - 输入 : Resolving an object by type _and_ registration name/identifier

c# - 动态引导网格布局

.net - 用简短的语言解释为什么需要 IQueryable<T>

c# - Linq 查询以一对多关系搜索 "Many"

c# - 为什么 UserPrincipal.GetAuthorizationGroups() 可能对一个委托(delegate)人失败而不是另一个委托(delegate)人?

c# - 表,SQL C# 通过在 datagridview 中选择一行将数据添加到 "FK table"

linq - 如何在linq中格式化十进制值

c# - 从列表中的 linq 查询中选择特定字段