符合列表中条件的连续元素的子列表 c# linq
Posted
技术标签:
【中文标题】符合列表中条件的连续元素的子列表 c# linq【英文标题】:Sublists of consecutive elements that fit a condition in a list c# linq 【发布时间】:2022-01-18 12:09:07 【问题描述】:所以假设我们有一个停车场(表示为字典
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的主要内容,如果未能解决你的问题,请参考以下文章
c#在遍历列表时删除元素-向后迭代或使用i--或使用linq同时迭代和删除?