如何使用linq和c#根据列中行之间的差异进行分组
本文关键字:之间 linq 何使用 | 更新日期: 2023-09-27 17:59:06
当行中的值之差大于5时,我想创建一个新组。
示例:
int[] list = {5,10,15,40,45,50,70,75};
应该给我3组:
1,[ 5,10,15 ]
2,[40,45,50]
3,[70,75]
这里可以用林克吗?
Thx!
利用副作用(group
)不是一个好的做法,但可能会有所帮助:
int[] list = { 5, 10, 15, 40, 45, 50, 70, 75 };
int step = 5;
int group = 1;
var result = list
.Select((item, index) => new {
prior = index == 0 ? item : list[index - 1],
item = item,
})
.GroupBy(pair => Math.Abs(pair.prior - pair.item) <= step ? group : ++group,
pair => pair.item);
测试:
string report = string.Join(Environment.NewLine, result
.Select(chunk => String.Format("{0}: [{1}]", chunk.Key, String.Join(", ", chunk))));
结果:
1: [5, 10, 15]
2: [40, 45, 50]
3: [70, 75]
假设集合定义了一个索引器,可以是这样的:
const int step = 5;
int currentGroup = 1;
var groups = list.Select((item, index) =>
{
if (index > 0 && item - step > list[index - 1])
{
currentGroup++;
}
return new {Group = currentGroup, Item = item};
}).GroupBy(i => i.Group).ToList();
在我看来,只需编写一个函数就可以了。这比其他答案中给出的Linq示例更容易理解和阅读。
public static List<List<int>> Group(this IEnumerable<int> sequence, int groupDiff) {
var groups = new List<List<int>>();
List<int> currGroup = null;
int? lastItem = null;
foreach (var item in sequence) {
if (lastItem == null || item - lastItem.Value > groupDiff) {
currGroup = new List<int>{ item };
groups.Add(currGroup);
} else {
// add item to current group
currGroup.Add(item);
}
lastItem = item;
}
return groups;
}
并称之为
List<List<int>> groups = Group(list, 5);
假设:list
排序。如果没有排序,只需先对其进行排序,然后使用上面的代码。
另外:如果你需要groups
成为int[][]
,只需根据你的喜好使用Linq方法ToArray()
。