C# 分组的linq实现
虽然在for循环中很容易实现,但我正在寻找一种简洁的linq方法来实现下面的 假设我有这个清单 S1,S1,S1,S2,S2,S1,S1,S1,S1,S2=>{S1,S1,S1},{S2,S2},{S1,S1},{S2} 这是一件事。 除上述内容外,在“断开到组”时添加另一个条件(类似于prev,current logic) 我在每个循环中都使用了大量的代码——有人知道linq是否可以帮助这些子组划分吗C# 分组的linq实现,c#,linq,.net-4.5,C#,Linq,.net 4.5,虽然在for循环中很容易实现,但我正在寻找一种简洁的linq方法来实现下面的 假设我有这个清单 S1,S1,S1,S2,S2,S1,S1,S1,S1,S2=>{S1,S1,S1},{S2,S2},{S1,S1},{S2} 这是一件事。 除上述内容外,在“断开到组”时添加另一个条件(类似于prev,current logic) 我在每个循环中都使用了大量的代码——有人知道linq是否可以帮助这些子组划分吗 foreach (var item in group){ if (item.membe
foreach (var item in group){
if (item.member1 != prev.member1 || item.member2 - prev.member2 > 88)
cut the group till prev item...
}
我同意@Tim Schmelter的评论,他认为LINQ可能不是适合这项工作的工具,因为我想不出一种方法可以像循环一样可读 我想到的一件事是。这将为
IEnumerable
中的每个元素调用一个函数,传递当前元素和上一次调用的返回值
类似于下面的东西会起作用,但它的作用(至少对我来说)一点也不明显。(string)null
参数是传递给func
的第一个值,因此我添加了对previousString!=空
List<string> someList = new List<string>()
{
"S1", "S1", "S1", "S2", "S2", "S1", "S1", "S1", "S2"
};
List<List<string>> groups = new List<List<string>>();
List<string> currentGroup = new List<string>();
someList.Aggregate((string)null, (previousString, currentString) =>
{
if (previousString != null && currentString != previousString)
{
//it's not the first group
//and the value is different which denotes a new group
groups.Add(currentGroup);
currentGroup = new List<string>();
}
currentGroup.Add(currentString);
return currentString;
});
groups.Add(currentGroup);
foreach (var group in groups)
{
Console.WriteLine(string.Join(", ", group));
}
List someList=新列表()
{
“S1”、“S1”、“S1”、“S2”、“S2”、“S1”、“S1”、“S1”、“S1”、“S1”、“S2”
};
列表组=新列表();
List currentGroup=新列表();
聚合((字符串)null,(previousString,currentString)=>
{
if(previousString!=null&¤tString!=previousString)
{
//这不是第一组
//值不同,表示一个新的组
添加(当前组);
currentGroup=新列表();
}
currentGroup.Add(currentString);
返回当前字符串;
});
添加(当前组);
foreach(组中的var组)
{
Console.WriteLine(string.Join(“,”,group));
}
这张照片
S1,S1,S1
S2,S2
S1,S1,S1
S2
如果你已经展示了你对每一种方法的看法,这将非常有帮助——你在这里试图实现的目标并不明显。如果涉及到“prev next”,LINQ不是适合这项工作的工具。这是可能的,但代价是LINQ的唯一目的:可读性。是的,听起来是正确的,不会在这里使用LINQ(太糟糕了,这里的代码太长了……)很好!!我会试试的-谢谢分享这个:)