1

我有一个这种格式的字符串数组(每一行都是数组中的一个槽):

IT1
PID
参考
参考
REF
IT1
PID
参考
IT1
PID
参考
参考
...

我想通过最后一个 REF 将每个 IT1 提取到使用 LINQ 的新数组中。新结果将是一个IEnumerable<IEnumerable<string>>.

使用上面的字符串槽数组示例,新的 IEnumerable 集合IEnumerable<string>中应该有 3。

例如:

1 级
IT1
PID
参考
参考
REF
端 1 级

2 类
IT1
PID
REF
结束 2 类

3 级
IT1
PID
参考
REF
结束 3 级
...

请注意,阵列的某些部分有 1 个 REF、一些 2 REF 和一些 3 REF。

如何使用 LINQ 将 IT1 到最后一个 REF 的每个部分提取到新的 REF 集合中IEnumerable<IEnumerable<string>>

伪代码...

var result = arrayData.Select(s => s.StartsWith("IT1")
.GroupBy(...)
.Select(result => new {IT1 through last ref goes here})
.ToArray();

感谢大家的帮助!

4

2 回答 2

3

GroupBy您可以使用以下临时状态对数组进行分区:

var counter = 0;
var arrays = input.GroupBy(s => counter += s == "IT1" ? 1 : 0)
                  .Select(g => g.ToArray())
                  .ToArray();

这将为您提供一个数组数组;每个子数组都将从一个"IT1"元素开始,并以您在下一个之前输入的任何内容结束"IT1"。如果您的数据有效,那将是一个"REF". 如果数据无效,您需要指定在这种情况下应该发生什么。

不过,我不太确定您希望如何将这些数组转换为匿名对象。匿名对象可能有一个未知的类型名称,但它们仍然是非常强类型的:您无法动态决定其成员的数量、名称和类型。

于 2012-10-02T14:21:34.530 回答
0
public static IEnumerable<IEnumerable<string>> Partitian(IEnumerable<string> source)
{
    List<string> buffer = new List<string>();
    int? lastRef = null;

    int position = 0;
    foreach (string s in source)
    {
        if (s == "REF")
            lastRef = position;
        else if (s == "IT1" && lastRef.HasValue)
        {
            yield return buffer.Take(lastRef.Value + 1);
            buffer.Clear();
            position = 0;
            lastRef = null;
        }
        buffer.Add(s);

        position++;
    }

    if (buffer.Any() && lastRef.HasValue)
        yield return buffer;
}
于 2012-10-02T14:28:04.333 回答