You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用LINQ提取C#列表开头的连续相同元素

实现思路

  • 核心匹配需求的语义是:从序列起始位置取元素,直到出现和首元素不相等的项就停止,刚好对应LINQ原语TakeWhile的能力。
  • 需要处理两个边界:空序列访问首元素的异常、值/引用类型的兼容相等比较。

可复用LINQ扩展方法(高性能无重复枚举)

public static IEnumerable<T> TakeLeadingSame<T>(this IEnumerable<T> source)
{
    using var enumerator = source.GetEnumerator();
    // 空序列直接返回空
    if (!enumerator.MoveNext()) yield break;
    
    var first = enumerator.Current;
    var comparer = EqualityComparer<T>.Default;
    // 返回首个基准元素
    yield return first;
    // 遍历后续元素,遇到不匹配的直接终止
    while (enumerator.MoveNext())
    {
        if (!comparer.Equals(enumerator.Current, first)) yield break;
        yield return enumerator.Current;
    }
}

调用示例

  • 对应给出的测试用例:
// 测试用例1
var input1 = new List<int> {2,2,2,2,5,6,7,8,2,3};
var result1 = input1.TakeLeadingSame().ToList(); 
// 输出:2,2,2,2

// 测试用例2
var input2 = new List<int> {5,6,7};
var result2 = input2.TakeLeadingSame().ToList();
// 输出:5

临时简化写法(无需封装)

如果是已经实例化的集合(如数组、List<T>),可直接调用原语实现:

var input = new List<int> {2,2,2,5,6};
// 先判空避免索引越界
if (input.Count == 0) return;
var first = input[0];
var result = input.TakeWhile(x => EqualityComparer<int>.Default.Equals(x, first)).ToList();

内容的提问来源于stack exchange,提问作者user15515307

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 19:06:03