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

Posted

技术标签:

【中文标题】符合列表中条件的连续元素的子列表 c# linq【英文标题】:Sublists of consecutive elements that fit a condition in a list c# linq 【发布时间】:2022-01-18 12:09:07 【问题描述】:

所以假设我们有一个停车场(表示为字典: 每个停车场都有它的 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)

【问题讨论】:

"我不知道如何获取第一个匹配的生成列表。"我不明白你的意思。考虑编辑问题并提供适当的要求 @JonasH 是的,对不起,我更正了,对不起。非常感谢 很可能,您可以使用Aggregate 方法 好的,我试图澄清这个例子@Error404Brainnotfound 这更清楚了,谢谢@hesolar 【参考方案1】:

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

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;
        
    

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

【讨论】:

【参考方案2】:

您可以申请 GroupWhile 解决方案here。

parking.Where(X => X.Value)
.Select(x => x.Key)
.GroupWhile((x, y) => y - x == 1)
.ToList()

【讨论】:

以上是关于符合列表中条件的连续元素的子列表 c# linq的主要内容,如果未能解决你的问题,请参考以下文章

如何从列表数组(linq 列表)C# 中的所有元素调用方法

C# LINQ 在列表中查找重复项

c#在遍历列表时删除元素-向后迭代或使用i--或使用linq同时迭代和删除?

c# LINQ-to-XML 更新(保存)排序后文件中的元素列表

C# LINQ - 按属性分组列表,然后按不同组选择

C ++如何一起使用 std::adjacent 和 std::count_if 来计算向量中条件的出现次数