3

使用以下对象层次结构,我需要确认每个字符串中是否存在所有字符串值Id,例如InventoriesSearchResult

给定一个string[] list = { "123", "234", "345" }确认所有值在元素list数组中至少出现一次。Inventory我很好奇是否可以使用一个 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 将遍历整个库存,然后询问库存(如果它不为空)并找到包含列表中值之一的库存。

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