【发布时间】:2013-01-17 07:28:48
【问题描述】:
我有一个数据列表,我想找到列表中相等的最长元素序列的长度。这很容易通过对集合进行循环来完成,但是我想知道是否有一个 Linq 查询可以做到这一点。感谢您的帮助。
【问题讨论】:
-
用循环粘贴代码,我们不知道你的数据是什么样的..
-
没关系,重要的是元素类型支持相等比较。假设它是一个整数列表。
我有一个数据列表,我想找到列表中相等的最长元素序列的长度。这很容易通过对集合进行循环来完成,但是我想知道是否有一个 Linq 查询可以做到这一点。感谢您的帮助。
【问题讨论】:
var longest = list.Select((x,i) => list.Skip(i).TakeWhile(c => c == x).Count()).Max();
【讨论】:
只需遍历序列,当一个项目等于前一个时增加一个计数器,如果不是则重置它。
public static int LongestSequence<T>(IEnumerable<T> source, IEqualityComparer<T> comparer)
{
comparer = comparer ?? EqualityComparer<T>.Default;
using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext()) //empty sequence
return 0;
T previous = iterator.Current;
int count = 1;
int maxCount = 1;
while (iterator.MoveNext())
{
if (comparer.Equals(iterator.Current, previous))
{
count++;
}
else
{
maxCount = Math.Max(maxCount, count);
count = 1;
previous = iterator.Current;
}
}
return maxCount;
}
}
【讨论】: