3

次のコードをLinq形式に縮小する方法はありますか?

foreach (var current in currentWhiteListApps)
{
    var exists = false;

    foreach (var whiteList in clientSideWhiteLists)
    {
       if (current.appID.Equals(whiteList.appID))
       {
           exists = true;
       }
    }
    if (!exists)
    {
        deleteList.Add(current);
    }
}

私が考えることができるのは:

currentWhiteListApps.Select(x => {
    var any = clientSideWhiteLists.Where(y => y.appID.Equals(x.appID));
    if (any.Any())
        deleteList.AddRange(any.ToArray());
    return x;
});

Reason For LINQ
LINQは、ネストされたforeachループよりもはるかに読みやすく、必要なコードも少なくて済みます。だからこれが私がそれを望んでいる理由ですLINQ

4

3 に答える 3

2
var deleteList = currentWhiteListApps.Where(x =>
                     clientSideWhiteLists.All(y => !x.appID.Equals(y.appID)))
                                     .ToList();
于 2013-03-25T11:42:06.663 に答える
1
var deleteList = currentWhiteListApps.Except(clientSideWhiteLists).ToList();

このソリューションは、両方のコレクションに同じタイプの要素が含まれており、このタイプがappIDを比較するEquals()をオーバーライドしていることを前提としています。

于 2013-03-25T11:43:24.123 に答える
0
var validIds = new HashSet<int>(clientSideWhiteLists.Select(x => x.appId));
var deleteList = currentWhiteListApps.Where(x => !validIds.Contains(x.appId)).ToList();
于 2013-03-25T13:41:25.430 に答える