如何使用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
相关产品推荐
相关产品推荐

