簡體   English   中英

使用linq使用另一個條件刪除一個列表中的元素

[英]Use linq to remove elements in one list using a condition in another

我有

List<X> A = new List<X>{null,"1",null,"3"};
List<Y> B = new List<Y>{  0 , 1 ,  2 , 3 };

我想使用linq僅列出B中具有不為null的對應值的elemnt。 所以...

List<Y> C = [some linq expression using A and B];

C現在有1和3。

如何才能做到這一點?

List<String> A = new List<String> { null, "1", null, "3" };
List<int> B = new List<int> { 0, 1, 2, 3 };

var C = A.Zip(B, (s, n) => new { a = s, b = n })
         .Where(x => x.a != null)
         .Select(x => x.b)
         .ToList();
var c = B.Where((o, i) => A[i] != null).ToList();

編輯以注意,在撰寫本文時,尚不清楚兩個列表均按索引對齊。 給定該信息,不確定該響應的值。 它肯定沒有我最初想象的有價值。

本質上,您想要的是一個十字路口。 這是使用Intersect()的答案,該答案基於示例中提供的數據和參數:

    var a = new List<string> { null, "1", null, "3" };
    var b = new List<int> { 0, 1, 2, 3 };
    var intersection = a.Intersect(b.Select(x => x.ToString())).ToList();

您應該能夠適應適合您的交叉路口。

如果您的兩個列表中確實都包含可為空的項目,那么您將需要在b列表上進行其他空檢查(我只是在其中的每個項目上盲目地調用ToString())。 但是,如果B中不包含空值並且您正在做交集,則沒有理由在A中過濾出空值,作為該過程的一部分,它們將被過濾掉。

還請考慮:

    b.Select(x => x.ToString()) ...

可能很容易是:

    b.Select(x => ConvertTypeBToTypeA(x)) ...
List<string> A = new List<string> { null, "1", null, "3" };
List<int> B = new List<int> { 0, 1, 2, 3 };

var C = B.Where(x => A.Contains(x.ToString()));

嘗試這個:

var c = Enumerable.Range(0, Math.Min(B.Count, A.Count))
                  .Where(i => A[i] != null)
                  .Select(i => B[i]).ToList();

擴展方法如何避免一些開銷?

public static class Ext {
    public static IEnumerable<T1> WhereOther<T1, T2>(this IEnumerable<T1> src, IEnumerable<T2> filter, Func<T2, bool> pred) {
        using (var isrc = src.GetEnumerator())
        using (var ifilter = filter.GetEnumerator())
            while (ifilter.MoveNext())
                if (isrc.MoveNext())
                    if (pred(ifilter.Current))
                        yield return isrc.Current;

    }
}

創建完成后,您可以使用

var ans = B.WhereOther(A, p => p != null);

您可能還需要一個IQueryable變體,盡管創建變體並不是那么容易。 我猜你可以作弊並返回一個應用AsEnumerable()然后使用IEnumerable.WhereOther的lambda。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM