符合列表中条件的连续元素的子列表c# linq

问题描述 投票:0回答:2

假设我们有一个停车场(用字典表示: 每个停车场都有它的 ID 和一个布尔值(空闲、已填充)。 这样:

Dictionary<int,bool> parking..
parking[0]= true // means that the first parking lot is free

我的问题是我想获取与条件匹配的连续元素的所有子列表:停车场是免费的。

首先我可以轻松获得适合这种情况的元素:

parking.Where(X => X.Value).Select(x => x.Key).ToList();

但是使用 linq 操作我不知道如何获取第一个匹配的生成列表。 我可以在没有数千个 foreach-while 循环检查逐一迭代的情况下做到这一点吗?使用 linq 是否有更简单的方法?

该方法获取连续的免费停车场列表 数据: 0-免费, 1-免费, 2 填充 , 3-免费 结果将是两个列表: 第一个将包含 => 0 ,1 第二个将包含 => 3 这些是连续免费停车场的列表。

public List<List<int>> ConsecutiveParkingLotFree(int numberOfConsecutive){}
c# linq .net-core
2个回答
2
投票

您始终可以编写自己的辅助函数来执行此类操作。例如

public static IEnumerable<List<T>> GroupSequential<T, TKey>(
    this IEnumerable<T> self,
    Func<T, bool> condition)
{
    var list = new List<T>();
    using var enumerator = self.GetEnumerator();
    if (enumerator.MoveNext())
    {
        var current = enumerator.Current;
        var oldValue = condition(current);
        if (oldValue)
        {
            list.Add(current);
        }
        while (enumerator.MoveNext())
        {
            current = enumerator.Current;
            var newValue = condition(current);
            if (newValue)
            {
                list.Add(current);
            }
            else if (oldValue)
            {
                yield return list;
                list = new List<T>();
            }
            oldValue = newValue;
        }

        if (list.Count > 0)
        {
            yield return list;
        }
    }
}

这会将所有具有真实值的项目放入列表中。当遇到 true->false 转换时,将返回并重新创建列表。我希望有更紧凑的方法来编写这样的函数,但它应该可以完成这项工作。


1
投票

您可以在此处应用 GroupWhile 解决方案。

parking.Where(X => X.Value)
.Select(x => x.Key)
.GroupWhile((x, y) => y - x == 1)
.ToList()
© www.soinside.com 2019 - 2024. All rights reserved.