c# - 如何从多个相似序列中选择最后一组串联序列

标签 c# .net linq collections

我有一个 int 数组,它是多个相似数组的串联数组,所有数组都从 1 开始。

1、2、3、4
1, 2
1, 2, 3
一、二

int[] list = { 1, 2, 3, 4, 1, 2, 1, 2, 3, 1, 2 };

我想要实现的是获得结果的“最后一组”,即 {1, 2}。

尝试:

int[] list = { 1, 2, 3, 4, 1, 2, 1, 2, 3, 1, 2 };

List<int> lastSet = new List<int>();
var totalSets = list.Count(x => x == 1);

int encounter = 0;
foreach (var i in list)
{
    if (i == 1)
        encounter += 1;

    if (encounter == totalSets)
        lastSet.Add(i);
}

lastSet.ToList().ForEach(x => Console.WriteLine(x));

是否有更好的方法使用 LINQ 实现此目的,也许是 SkipWhileGroupByAggregate

最佳答案

如果您可以使您的列表成为实际的 List<int>或者如果您不介意通过 .ToList() 创建列表的副本,你可以这样做:

var list = new[]{ 1, 2, 3, 4, 1, 2, 1, 2, 3, 1, 2 }.ToList();
var lastSet = list.Skip(list.LastIndexOf(1)).ToList();

否则,Aggregate可以工作,但有点难看:

var lastSet = list.Aggregate(new List<int>{1}, (seed, i) => {
    if(i == 1) {seed.Clear(); }
    seed.Add(i);
    return seed;
})

更新

正如 dtb 指出的那样,您可以使用 Array.LastIndexOf 而不是创建列表:

var list = new[]{ 1, 2, 3, 4, 1, 2, 1, 2, 3, 1, 2 };
var lastSet = list.Skip(Array.LastIndexOf(list, 1)).ToList();

关于c# - 如何从多个相似序列中选择最后一组串联序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10544758/

相关文章:

c# - struct 与 for 循环的使用

c# - 重用 session 标识符

c# - 如何使用依赖于模型属性的接口(interface)设计领域模型

c# - JSON.Net 将结构序列化/反序列化为字符串

c# - SciChart FastLineRenderableSeries 抗锯齿不起作用

c# - Unity - 移动设备相机被镜像

c# - 如何将内部构件导出到 F# 中的测试项目?

c# - GroupPrincipal 重命名组

c# - 使用 LINQ 从两个列表中获取所有可能的连接对

c# - linq 按 2 个条件计数