gpt4 book ai didi

c# - 使用投影时,IEnumerable 和 Lists 之间有什么区别?

转载 作者:行者123 更新时间:2023-11-30 15:15:46 25 4
gpt4 key购买 nike

我注意到在涉及对象副本时,IEnumerable 和列表之间存在一些看似奇怪的差异。

我做了什么:

A:使用深拷贝构造函数通过投影实现 IEnumerable

B:使用深拷贝构造函数通过投影列表

在下面的示例中,为什么在 IEnumerables 的情况下我似乎仍然可以访问原始对象,即使我的构造函数是深拷贝?

程序输出:

世界,您好!

奇怪的结果:023

合理的结果:123

按任意键继续。 . .

using System;
using System.Collections.Generic;
using System.Linq;

namespace Test
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");

Foo f1 = new Foo(1);
Foo f2 = new Foo(2);
Foo f3 = new Foo(3);
List<Foo> foos = new List<Foo> { f1, f2, f3 };

IEnumerable<Tuple<Foo, Bar>> tuplesWeird = foos.Select(x => new Tuple<Foo, Bar>(x, new Bar(x.m_bar)));
List<Tuple<Foo, Bar>> tuplesSane = foos.Select(x => new Tuple<Foo, Bar>(x, new Bar(x.m_bar))).ToList();

f1.m_bar.m_value = 0;

Console.WriteLine("weird result: "+tuplesWeird.Select(x => x.Item2.ToString()).Aggregate((x,y) => x + y ));
Console.WriteLine("sane result: " + tuplesSane.Select(x => x.Item2.ToString()).Aggregate((x, y) => x + y));
}


private class Foo
{
public Bar m_bar;
public Foo(int i)
{
m_bar = new Bar(i);
}

public override string ToString()
{
return m_bar.ToString();
}
}

private class Bar
{
public int m_value;
public Bar(int value)
{
m_value = value;
}

public Bar(Bar bar)
{
m_value = bar.m_value;
}

public override string ToString()
{
return m_value.ToString();
}
}
}
}

最佳答案

就是枚举IEnumerable的时候。 tuplesWeird 在您调用 print 方法之前不会被枚举 - 即在 f1 中的值被更改之后,而 tuplesSane 在您调用ToList() 方法。

关于c# - 使用投影时,IEnumerable 和 Lists 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51560093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com