[英]How to Remove elements from one List based another list's element and condition?
[英]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.