首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算列表中的重复数

计算列表中的重复数
EN

Stack Overflow用户
提问于 2010-10-01 21:01:23
回答 7查看 2.7K关注 0票数 8

我有一份清单:

代码语言:javascript
复制
int list = { 1,1,2,3,4,4,5,7,7,7,10};

现在我需要编写一个计算双精度数的程序。当一个数字之前的数字相同时,该数字是双精度的。我希望你能理解。所以1是双精度,4是双精度,我们在7,7,7中得到了2个双精度。

EN

回答 7

Stack Overflow用户

发布于 2010-10-01 21:04:29

在LINQ中有一个解决方案:

代码语言:javascript
复制
var doubles = list.Skip(1)
                  .Where((number, index) => list[index] == number);

这将通过跳过列表的第一个成员来创建另一个序列,然后从两个序列中查找具有相同索引和相同值的元素。它将以线性时间运行,但这只是因为列表提供了按索引访问O(1)

票数 26
EN

Stack Overflow用户

发布于 2010-10-01 21:09:12

这是一种相对简单的方法,它只对序列迭代一次,并且适用于任何序列(不仅仅是列表):

代码语言:javascript
复制
public IEnumerable<T> FindConsecutiveDuplicates<T>(this IEnumerable<T> source)
{
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            yield break;
        }
        T current = iterator.Current;
        while (iterator.MoveNext())
        {
            if (EqualityComparer<T>.Default.Equals(current, iterator.Current))
            {
                yield return current;
            }
            current = iterator.Current;
        }
    }
}

这是另一个更简单的查询,因为它只是一个LINQ查询,但它在Where子句中使用了副作用,这是令人讨厌的:

代码语言:javascript
复制
IEnumerable<int> sequence = ...;

bool first = true;
int current = 0;
var result = sequence.Where(x => {
   bool result = !first && x == current;
   current = x;
   first = false;
   return result;
});

第三种方法更简洁,但它使用的SelectConsecutive方法基本上是来自this answerSelectPairs,但为了更清楚一些,将其重命名为:)

代码语言:javascript
复制
IEnumerable<int> sequence = ...;
IEnumerable<int> result = sequence.SelectConsecutive((x, y) => new { x, y })
                                  .Where(z => z.x == z.y);
票数 7
EN

Stack Overflow用户

发布于 2010-10-01 21:21:25

似乎每个人都在试图找到好的方法来做这件事,所以这里有一个非常糟糕的方法:

代码语言:javascript
复制
List<int> doubles = new List<int>();
Dictionary<int, bool> seenBefore = new Dictionary<int, bool>();

foreach(int i in list)
{
    try
    {
        seenBefore.Add(i, true);
    }
    catch (ArgumentException)
    {
        doubles.Add(i);
    }
}

return doubles;

请不要那样做。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3839377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档