我有这个功能来重复一个序列:
public static List<T> Repeat<T>(this IEnumerable<T> lst, int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException("count");
var ret = Enumerable.Empty<T>();
for (var i = 0; i < count; i++)
ret = ret.Concat(lst);
return ret.ToList();
}
现在,如果我这样做:
var d = Enumerable.Range(1, 100);
var f = d.Select(t => new Person()).Repeat(10);
int i = f.Distinct().Count();
我希望i
是 100,但它给了我 1000!我的问题严格来说是为什么会发生这种情况?Linq 不应该足够聪明地找出我需要与 variable 连接的第一个选定的 100 人ret
吗?我有一种感觉,当它与 a 一起使用时,它在..执行时Concat
被优先考虑。Select
ret.ToList()
编辑:
如果我这样做,我会得到预期的正确结果:
var f = d.Select(t => new Person()).ToList().Repeat(10);
int i = f.Distinct().Count(); //prints 100
再次编辑:
我没有覆盖Equals
. 我只是想获得 100 个独特的人(当然是通过参考)。我的问题是有人可以向我解释为什么 Linq 不先进行选择操作然后进行连接(当然是在执行时)?