gpt4 book ai didi

c# - 使用 LINQ 查询文本文件

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

我有一个简单的文本文件,其中包含一些具有以下结构的 CSV:

@Parent1_Field1, Parent1_Field2, Parent1_Field3
Child1_Field1, Child1_Field2
Child2_Field1, Child2_Field2
...etc.
@Parent2_Field1, Parent2_Field2, Parent2_Field3
Child1_Field1, Child1_Field2
Child2_Field1, Child2_Field2
...etc.

'@' 表示紧接其下的子对象的父对象。 (这可以使用 XML 更好地表示,但在我的情况下这不是一个选项。)

我的目的是使用 LINQ 来查询这个文件,而不是将它的全部内容加载到内存中。首先,我创建了一个实现 IEnumerable 的类(此处为 MyCustomReader),我在其中使用 StreamReader 获取文件的每一行。

例如以下获取所有父对象(没有子对象):

from line in MyCustomReader
where line.StartsWith("@")
select Parent.Create(line)

但是,当我想创建同时涉及父对象和子对象的查询时,我遇到了困难。例如,获取特定父对象的所有子对象或获取特定子字段包含相同值的所有父对象。

例如这会获取特定父对象的所有子对象:

public IEnumerable<Child> GetChildrenForAParent(string uniqueParentName)
{
Parent parent = null;
foreach (string line in MyCustomReader)
{
if (line.StartsWith("@"))
parent = Parent.Create(line);
else if (parent.UniqueName == uniqueParentName)
yield return Child.Create(line);
}
}

第二个例子:

public IEnumerable<Parent> GetParentsWhereChildHasThisValue(string childFiledValue)
{
Parent parent = null;
foreach (string line in MyCustomReader)
{
if (line.StartsWith("@"))
{
parent = Line.Create(line);
}
else //child
{
Child child = Child.Create(line);
if (child.FiledValue == childFiledValue)
yield return parent;
}
}
}

如何使用 LINQ 实现这两个示例?

最佳答案

这不是很漂亮,但对于第一个,像下面这样的东西应该可以工作:

MyCustomReader.SkipWhile(line => line != uniqueParentName).Skip(1).
TakeWhile(line => !line.StartsWith("@"));

编辑:好吧,我很无聊。我认为这将为您完成第二个(但显然这不是适合 LINQ 的问题):

var res = MyCustomReader.Where(parentLine => parentLine.StartsWith("@"))
.Join(MyCustomReader.Where(childLine => !childLine.StartsWith("@")),
parentLine => parentLine,
childLine => MyCustomReader.Reverse<string>()
.SkipWhile(z => z != childLine)
.SkipWhile(x => !x.StartsWith("@")).First(),
(x, y) => new { Parent = x, Child = y })
.Where(a => a.Child == childFiledValue).Select(a => a.Parent);

关于c# - 使用 LINQ 查询文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1290432/

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