【问题标题】:Can you use Linq to find relationships between elements in a collection?您可以使用 Linq 查找集合中元素之间的关系吗?
【发布时间】:2013-01-17 07:28:48
【问题描述】:

我有一个数据列表,我想找到列表中相等的最长元素序列的长度。这很容易通过对集合进行循环来完成,但是我想知道是否有一个 Linq 查询可以做到这一点。感谢您的帮助。

【问题讨论】:

  • 用循环粘贴代码,我们不知道你的数据是什么样的..
  • 没关系,重要的是元素类型支持相等比较。假设它是一个整数列表。

标签: c# linq querying


【解决方案1】:
var longest = list.Select((x,i) => list.Skip(i).TakeWhile(c => c == x).Count()).Max();

【讨论】:

  • 请注意,您会一遍又一遍地不必要地进行大量计数...这是 O(n^2),而可能是 O(n)。如果这对 OP 很重要......
  • 是的,对于大型列表,循环可能会更快。
【解决方案2】:

只需遍历序列,当一个项目等于前一个时增加一个计数器,如果不是则重置它。

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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多