从对象子列表中删除项目(LINQ)

时间:2014-08-19 22:11:41

标签: c# linq

我有一个看起来像这样的对象:

public class Consortium
{
    public string Id { get; set; }

    [JsonConverter(typeof(EnumDescriptionConverter))]
    public SourceType Type { get; set; }       

    public List<UserLibrary> Branches { get; set; }
}

每个Consortium都有一个UserLibrary与之关联的列表,该类如下所示:

public class UserLibrary
{
    public string LibraryId { get; set; }

    public string RetailerId {get; set;}

    public string UserId { get; set; }

    public string Name { get; set; }

    public DateTime CreatedAt { get; set; }
}

我有一个方法允许用户从他们的一个联盟中删除一个库(注意:可能有许多分支与该联盟相关联)。

但是,我只提供LibraryId,所以我被迫遍历他们的Consortium列表,找到哪一个包含给定的ID,然后迭代分支并删除与id匹配的分支。

以下是我目前正在实现的目标:

// Get the current list of consortiums
var user = _mediator.Send(new GetUserProfileCommand { UserProfileId = _principle.UserProfileId });
var userConsortia = user.SavedConsortia;

// the consortium to remove the library from
var branchToRemove = _libraryService.GetLibrary(id);
var consortRemove = new UserConsortium();

foreach (var userConsortium in userConsortia)
{    
    if (userConsortium.Branches.FirstOrDefault(c => string.Equals(c.LibraryId, id, StringComparison.OrdinalIgnoreCase)) != null)
    {
        consortRemove = userConsortium;
    }
}

// if the consortium id is null, something is f*
if (consortRemove.Id == null)
{
    return new JsonDotNetResult(HttpStatusCode.BadRequest);
}

// first remove the consortia
userConsortia.Remove(consortRemove);

// remove the branch from the consortium
consortRemove.Branches.RemoveAll(ul => string.Equals(ul.LibraryId, id, StringComparison.OrdinalIgnoreCase));

// add it back in without the branch
userConsortia.Add(consortRemove);        

问题:

我是否缺少一个可以帮助我巩固这种逻辑的LINQ表达式,还是有更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

是的,根据口味,您可以采取一些方法。简化您所获得的最简单方法是:

var branchToRemove = _libraryService.GetLibrary(id);
// .Single() will throw an exception unless there is one and only one match.
var consortRemove = userConsortia.Single(
    c => c.Branches.Any(
        b => string.Equals(b.LibraryId, id, StringComparison.OrdinalIgnoreCase));
// remove the consortia
userConsortia.Remove(consortRemove);

答案 1 :(得分:0)

为什么不是这样的?从您的代码中我可以看到您要删除目标&#34;删除分支&#34;来自你收藏中的所有财团。

foreach (UserConsortium userConsortium in userConsortia)
{
    userConsortium.Branches.RemoveAll(c => string.Equals(c.LibraryId, id, StringComparison.OrdinalIgnoreCase));
}