9

私は2つのリストを持っています:

var list1 = new List<string> { "A", "A", "B", C" };
var list2 = new List<string> { "A", "B" };

そして、次のようなリストを作成したいと思います

var result = new[] { "A", "C" };

list1リストが削除されたすべての要素である場合、重複を削除するlist2ため、これには Linq 拡張メソッドはないと思います。Except

これを行う非 linq の方法は次のようになります。

var tempList = list1.ToList();
foreach(var item in list2)
{
    tempList.Remove(item);
}

しかし、見逃したかもしれないLinq拡張メソッドがあるかどうか疑問に思っています。

編集:

おそらく何もないので、私が作成した拡張メソッドをここに示します。

public static class LinqExtensions
{
    public static IEnumerable<T> RemoveRange<T>(this IEnumerable<T> source, IEnumerable<T> second)
    {
        var tempList = source.ToList();

        foreach(var item in second)
        {
            tempList.Remove(item);
        }

        return tempList;
    }

    public static IEnumerable<TFirst> RemoveMany<TFirst, TSecond>(this IEnumerable<TFirst> source, IEnumerable<TSecond> second, Func<TSecond, IEnumerable<TFirst>> selector)
    {
        var tempList = source.ToList();

        foreach(var item in second.SelectMany(selector))
        {
            tempList.Remove(item);
        }

        return tempList;
    }
}

使用法:

list1.RemoveRange(list2)
4

3 に答える 3

2

LINQではありませんが、とにかく1行です:

list2.ForEach(l => list1.Remove(l));

List<int>ところで...何かがあればいいのですAddRangeが、同時にたくさんのアイテムを削除します。

于 2013-04-04T02:52:44.147 に答える
2

あなたの例を見ると、「list2のすべての要素がlist1から削除された」という意味だと思います。

var lookup2 = list2.ToLookup(str => str);

var result = from str in list1
             group str by str into strGroup
             let missingCount 
                  = Math.Max(0, strGroup.Count() - lookup2[strGroup.Key].Count())
             from missingStr in strGroup.Take(missingCount)
             select missingStr;
于 2013-04-04T02:58:26.023 に答える
1

結果の要素が来る順序を気にしない場合は、LINQ でそれを行うことができますGroupBy

var a = new List<string>{"A","A", "B", "C"};
var b = new List<string>{"A", "B"};
var res  =  a.Select(e => new {Key=e, Val=1})
    .Concat(b.Select(e => new {Key=e, Val=-1}))
    .GroupBy(e => e.Key, e => e.Val)
    .SelectMany(g => Enumerable.Repeat(g.Key, Math.Max(0, g.Sum())))
    .ToList();

これはideoneのデモです。

あなたの解決策は私の解決策よりもはるかに単純であることを認めなければならないので、これは単なる好奇心であり、これが LINQ でも実行できることを証明する方法と見なされるべきです。

仕組みは次のとおりです。最初のリストの各要素に対して、キーと値のペアを1;で追加します。2 番目のリストの各要素に対して、 を使用してキーと値のペアを追加します-1。次に、すべての要素をキーでグループ化し、それらの要素と負の要素を合計して、合計と同じ数のキーを生成し、結果が負の場合は何も選択しないようにします。

于 2013-04-04T02:56:45.047 に答える