3

Id次のオブジェクト階層では、すべての文字列値がInventoriesSearchResult例に存在するかどうかを確認する必要があります。

確認が与えられると、string[] list = { "123", "234", "345" }すべての値が要素listの配列に少なくとも1回存在します。Inventory1つのLINQステートメントを使用してこれをクリーンアップできるかどうか知りたいです。

SearchResult
--
Inventory[] Inventories

Inventory
--
String Id

今、私は分割していますlist例えば

list.Split(').ToDictionary(i => i.ToString(), i => false)

そして、辞書を繰り返し、各インベントリをテストします。次に、List<SearchResult>辞書に誤った値が残っていない場合は、新しいアイテムを作成してアイテムを追加します。これは不格好に感じます。

コード

// instock: IEnumerable<SearchResult>
foreach (var result in instock)
{
    Dictionary<string, bool> ids = list.Split(',').ToDictionary(i => i.ToString(), i => false);
    foreach (var id in ids)
        if (result.Inventory.Any(i => i.Id == id.Key))
            ids[id.Key] = true;

    if (!ids.Any(i => i.Value == false))
        // instockFiltered: List<SearchResult>
        instockFiltered.Add(result);
}
4

2 に答える 2

3

ここに私が書いたコードの一部があります。ここでの利点は、ハッシュ マップを使用しているため、理論的に線形の複雑さがあることです。

    public static bool ContainsAll<T>(this IEnumerable<T> superset, IEnumerable<T> subset, IEqualityComparer<T> comparer)
    {
        var set = new HashSet<T>(superset, comparer);
        return set.IsSupersetOf(subset);
    }
于 2012-06-27T15:31:00.727 に答える
1

この LINQ のビットは、在庫全体を反復処理してから、在庫を調査し (null でない場合)、リスト内の値の 1 つを含む在庫を見つけます。

var matches = instock.Where(stock => stock.Inventory != null && stock.Inventory.All(i => list.Contains(i.Id));
于 2012-06-27T15:29:09.010 に答える