我有一个以逗号分隔ID的列,我将其放入LINQ中的List。
我需要做的只是返回DataRows,其中此列表中的所有值都存在于另一个中,如果存在但我需要所有值,我已经使用了它。
以下代码:
results =
results.Where(
d => d["FilterIDs"] != null && // Check the row has FilterIds
!filterValues.Except(
d["FilterIDs"].ToString().Split(',').ToList(). // Tokenise the string
Where(s => !String.IsNullOrEmpty(s)).ToList(). // Filter out bad tokens
ConvertAll<int>(s => Convert.ToInt32(s)) // Convert all the tokens to ints
).Any());
}
所以,例如,我有一行在它的列'FilterIDs'中有1,2,3,4
然后我的列表'filterValues'中有1,2,3,4,5,6,7 - 在这种情况下,将返回此行。
另一行有1,8,9 - 只有1个匹配,因此不会返回。
我已经围成一圈并且已经失去了意志,所以任何帮助都非常感谢。
答案 0 :(得分:2)
您似乎刚刚撤消了Except
来电 - 当您的意思是A.Except(B)
时,您使用了B.Except(A)
。
那就是说,我就是这样写的:
var query = from row in results
let filterIds = row["FilterIDs"]
where filterIds != null
let numbers = filterIds.ToString()
.Split(',')
.Where(s => !string.IsNullOrEmpty(s))
.Select(int.Parse)
where !numbers.Except(filterValues).Any()
select row;
答案 1 :(得分:0)
我会使用Enumerable<T>.All()
:
results = results.Where(d => d["FilterIDs" != null &&
d["FilterIDs"].ToString()
.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(Int32.Parse)
.All(f => filterValues.Contains(f)));
答案 2 :(得分:0)
这个怎么样?
results =
results.Where(
d => !d.IsNull("FilterIDs") && // Check the row has FilterIds
d["FilterIDs"]
.ToString()
.Split(',') // Tokenise the string
.Where(s=>!String.IsNullOrEmpty(s))
.ConvertAll<int>(s => Convert.ToInt32(s))
.All(i => filterValues.Contains(i) )
);