我有一份清单:
int list = { 1,1,2,3,4,4,5,7,7,7,10};现在我需要编写一个计算双精度数的程序。当一个数字之前的数字相同时,该数字是双精度的。我希望你能理解。所以1是双精度,4是双精度,我们在7,7,7中得到了2个双精度。
发布于 2010-10-01 21:04:29
在LINQ中有一个解决方案:
var doubles = list.Skip(1)
.Where((number, index) => list[index] == number);这将通过跳过列表的第一个成员来创建另一个序列,然后从两个序列中查找具有相同索引和相同值的元素。它将以线性时间运行,但这只是因为列表提供了按索引访问O(1)。
发布于 2010-10-01 21:09:12
这是一种相对简单的方法,它只对序列迭代一次,并且适用于任何序列(不仅仅是列表):
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子句中使用了副作用,这是令人讨厌的:
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 answer的SelectPairs,但为了更清楚一些,将其重命名为:)
IEnumerable<int> sequence = ...;
IEnumerable<int> result = sequence.SelectConsecutive((x, y) => new { x, y })
.Where(z => z.x == z.y);发布于 2010-10-01 21:21:25
似乎每个人都在试图找到好的方法来做这件事,所以这里有一个非常糟糕的方法:
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;请不要那样做。
https://stackoverflow.com/questions/3839377
复制相似问题