4

我有一列有逗号分隔的 ID,我将它放入 LINQ 中的列表中。

我需要做的只是返回此列表中的所有值都存在于另一个中的 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

然后,我的 List 'filterValues' 中有 1,2,3,4,5,6,7 - 在这种情况下,将返回此行。

另一行有 1,8,9 - 只有 1 个匹配项,因此不会返回。

我一直在兜圈子,因此失去了意愿,因此非常感谢您的帮助。

4

3 回答 3

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;             
于 2012-10-12T14:37:09.523 回答
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)));
于 2012-10-12T14:35:47.107 回答
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) )
      );
于 2012-10-12T14:36:27.537 回答