gpt4 book ai didi

c# - Linq 内部的 Linq 导致序列不返回任何结果

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

这是我的类(class):

public class XDetail
{
public string Name { get; set; }
public int ID { get; set; }
}

public class X
{
public int XID { get; set; }
public int ID { get; set; }
}

ID 在它们之间共享以链接 X 和 XDetail(一对多关系)。我使用以下 linq 查询读入一个文件并塑造一个匿名类型:

var results = from line in File.ReadAllLines(file)
select new
{
XID = int.Parse(line.Substring(0, 8).TrimStart('0')),
Name = line.Substring(8, 255).Trim()
};

此数据用于检查现有的 X/XDetail 以进行适当的更改或添加新记录。 XList 是一个列表,XDetailList 是一个列表。

从那里我尝试了一个花哨的 linq 查询来匹配适当的项目:

var changedData = from x in XList
join xDetail in XDetailList on x.ID equals xDetail.ID
where
(!results.Any(p => p.XID.Equals(x.XID))
|| !results.Any(p => p.Name.Equals(xDetail.Name)))
select new
{
XValue = x,
XDetailValue = xDetail,
Result = (from result in results
where result.Name.Equals(xDetail.Name)
select result).Single() // This line is my bane
};

这样我就可以将正在寻找的结果塑造成新的匿名类型,但是当我尝试添加 Result = ... inner linq 查询时,我的整个集合变成:序列不包含任何元素。如果我删除它,我会得到我想要的结果集。 X/XDetail 是真正类型化的数据行,我需要在使用匹配的结果进一步处理时使用它们,但如果没有该结果,我将需要稍后执行 linq 查询以找到匹配项。我希望以一种伪酷的一步到位的方式做到这一点。

我已经尝试将结果更改为没有 where 子句并且我可以获得结果,但我希望匹配的结果。有没有更好的方法来编写这个或让结果集再次工作的方法?

最佳答案

一个问题是结果是一个 IEnumerable - 所以你每次都重新查询它导致 File.ReadAllLines(file) 执行 - 实际上你是调用 File.ReadAllLines(file) N 次听起来不太健康。

相反,您想将此枚举一次放入内存中 - 使用 ToList() 强制急切执行:

var results = (from line in File.ReadAllLines(file)
select new
{
XID = int.Parse(line.Substring(0, 8).TrimStart('0')),
Name = line.Substring(8, 255).Trim()
}).ToList();

关于c# - Linq 内部的 Linq 导致序列不返回任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7687734/

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