【发布时间】:2021-10-08 10:59:09
【问题描述】:
我有一个如下的 XML 文件:
<products>
<product id="1" name="USB Flash Memory 2 GB" />
<product id="2" name="USB Flash Memory 8 GB" />
<product id="3" name="Wireless Multi Media Keyboard" />
</products>
我使用XDocument 读取文件并将查询结果存储在IEnumerable<Product> 类型的变量中。
如果我向XDocument 添加了一个新元素,该变量会自动更新,所以我认为存在一些错误,所以我尝试使用List<Product> 类型变量并且它有效(即向@987654328 添加一个元素@不要使用该输入自动更新)
所以我的问题是为什么IEnumerable 绑定到XDocument 更改而List 不是?
完整代码:
namespace IEnumerableTest
{
public class Product
{
public int ID { get; set; }
public string ProductName { get; set; }
}
}
namespace IEnumerableTest
{
public partial class Form1 : Form
{
static string path = @"Products.xml";
XDocument xDoc = XDocument.Load(path);
IEnumerable<Product> productsEnum;
List<Product> productsList;
public Form1()
{
InitializeComponent();
productsEnum =
from p in xDoc.Descendants("product")
select new Product
{
ID = int.Parse(p.Attribute("id").Value),
ProductName = p.Attribute("name").Value
};
productsList =
(from p in xDoc.Descendants("product")
select new Product
{
ID = int.Parse(p.Attribute("id").Value),
ProductName = p.Attribute("name").Value
}).ToList();
}
void BindDataGridView()
{
dataGridViewEnum.DataSource = productsEnum.ToList();
dataGridViewList.DataSource = productsList;
}
private void Form1_Load(object sender, EventArgs e)
{
BindDataGridView();
}
private void btnAdd_Click(object sender, EventArgs e)
{
XElement newProduct =
new XElement("product",
new XAttribute("id", 4),
new XAttribute("name", "Wireless USB Optical Mouse"));
xDoc.Root.Add(newProduct);
BindDataGridView();
}
}
}
结果是这样的:
【问题讨论】:
-
而
IEnumerable就像一个数据的承诺,所以只有当你循环它时,你这里的Linq 查询才会真正执行。 -
ToList创建一个副本。IEnumarable使用原始引用。 -
@imsmn 不,这是一个糟糕的描述。
-
@DavidG 随时改进它,总是很高兴能在未来更好地描述事物。
-
@imsmn 我已经在我的评论中做了。 ToList 正在强制查询立即执行。
标签: c# xml list linq ienumerable