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 に答える