选择List <int> </int>中所有值的位置

时间:2012-10-12 14:29:24

标签: c# sql linq

我有一个以逗号分隔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个匹配,因此不会返回。

我已经围成一圈并且已经失去了意志,所以任何帮助都非常感谢。

3 个答案:

答案 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) )
      );