Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq对字符串进行分组_C#_.net_Linq_Parsing_Group By - Fatal编程技术网

C# 使用linq对字符串进行分组

C# 使用linq对字符串进行分组,c#,.net,linq,parsing,group-by,C#,.net,Linq,Parsing,Group By,谷歌搜索没有带来任何帮助,所以我在这里问:如何根据某个字符串的出现情况对字符串进行分组 宠物动物园的示例数据 Name: My little petting zoo CRLF Owner: Atrotygma CRLF AverageVisitors: 100 CRLF PricePerTicket: 5

谷歌搜索没有带来任何帮助,所以我在这里问:如何根据某个字符串的出现情况对字符串进行分组

宠物动物园的示例数据

Name:            My little petting zoo        CRLF
Owner:           Atrotygma                    CRLF
AverageVisitors: 100                          CRLF
PricePerTicket:  5                            CRLF
ZooSize:         20                           CRLF
Animal:          Goat                         CRLF
Age:             5                            CRLF
FavoriteFood:    Grass                        CRLF
Animal:          Sheep                        CRLF
Age:             3                            CRLF
Legs:            2 ( + 2 wheels)              CRLF
Animal:          Dire Wolf                    CRLF
Name:            Puppy                        CRLF
Size:            20                           CRLF
Age:             10.000                       CRLF
Classification:  Still alive                  CRLF
目标:动物应该分组在一起(指标:动物),每个动物后面跟着它的(随机的,不可预测的)属性(直到下一个动物)


我知道这是一种可怕的数据形式,但它不是我的,我无法更改任何内容。

考虑使用“动物:”上的
Split
来分解字符串。然后,您可以对生成的动物字符串集执行您喜欢的操作。

这将使您以所需的格式显示字符串。首先,我为您的字符串创建一个列表(使用适当的拆分选项),获取“动物”单词出现的索引,然后(这是我的头顶,可能是漫长的lol),制作一个临时列表,其中字符串位于aninal字符串之间,并在原始列表中循环修改这些特定字符串:

List<string> words = str.Split(new char[]{'\r','\n'},
                                       StringSplitOptions.RemoveEmptyEntries).ToList();
int[] indexes = words.Select((b, i) => b.StartsWith("Animal") ? i : -1).Where(i => i != -1).ToArray();
List<string> temp = new List<string>();
for (int i = 0; i < indexes.Length; i++)
{
      if (i == indexes.Length - 1)
         temp.AddRange(words.GetRange(indexes[i] + 1, words.Count - (indexes[i] + 1)));
      else
         temp.AddRange(words.GetRange(indexes[i] + 1, indexes[i + 1] - (indexes[i] + 1)));
}

for (int y = 0; y < words.Count; y++)
{
     if (temp.Contains(words[y]))
        words[y] = "\t" + words[y];
}
List words=str.Split(新字符[]{'\r','\n'},
StringSplitOptions.RemoveEmptyEntries.ToList();
int[]index=words.Select((b,i)=>b.StartsWith(“动物”)?i:-1)。其中(i=>i!=-1)。ToArray();
列表温度=新列表();
for(int i=0;i
经过这段漫长的旅程,你的单词列表将具有所需的格式

编辑: 捷径:

List<string> words = str.Split(new char[]{'\r','\n'},
                                       StringSplitOptions.RemoveEmptyEntries).ToList();
int[] indexes = words.Select((b, i) => b.StartsWith("Animal") ? i : -1).Where(i => i != -1).ToArray();
for (int i = 0; i < indexes.Length; i++)
{
    if (i == indexes.Length - 1)
        words = words.Select(s => words.GetRange(indexes[i] + 1, words.Count - (indexes[i] + 1)).Contains(s) ? s = "\t" + s : s).ToList();
    else
        words = words.Select(s => words.GetRange(indexes[i] + 1, indexes[i + 1] - (indexes[i] + 1)).Contains(s) ? s = "\t" + s : s).ToList();
}
List words=str.Split(新字符[]{'\r','\n'},
StringSplitOptions.RemoveEmptyEntries.ToList();
int[]index=words.Select((b,i)=>b.StartsWith(“动物”)?i:-1)。其中(i=>i!=-1)。ToArray();
for(int i=0;iwords.GetRange(索引[i]+1,words.Count-(索引[i]+1)).Contains(s)?s=“\t”+s:s).ToList();
其他的
words=words.Select(s=>words.GetRange(索引[i]+1,索引[i]--(索引[i]+1)).Contains(s)?s=“\t”+s:s).ToList();
}

仍然需要进行一些优化……

步骤1:创建对象结构。步骤2:将原始字符串解析为对象结构。步骤3:将对象结构分组。步骤4:将对象结构输出为所需格式。数据是如何呈现给您的?文件流?普通的旧绳子?你怎么知道动物属性何时停止,何时到达下一个动物?在最后一只动物之后有什么数据吗?动物之间是否存在其他数据?@SimonBelanger多行字符串如上所述,每行用CRLF分隔。@musefan唯一的指示器是下一个动物。如果我看到“动物”这个词,一个新的组应该开始,直到下一个“动物”出现,依此类推,直到没有数据留下是否存在其他数据[…]?':不,一旦第一只动物出现,以下数据仅与动物有关。然后我将得到如下内容:[…价格:5 CRLF ZooSize:20 CRLF],[山羊CRLF年龄:5 CRLF…]。但是如果消息中没有任何动物园信息呢?我不能假设结果数组中的第一个键是关于动物园的,也不能假设每个动物园信息都以“Name”开头……作为一个阅读字符串的人,你怎么知道哪个部分是关于动物园的?
List<string> words = str.Split(new char[]{'\r','\n'},
                                       StringSplitOptions.RemoveEmptyEntries).ToList();
int[] indexes = words.Select((b, i) => b.StartsWith("Animal") ? i : -1).Where(i => i != -1).ToArray();
for (int i = 0; i < indexes.Length; i++)
{
    if (i == indexes.Length - 1)
        words = words.Select(s => words.GetRange(indexes[i] + 1, words.Count - (indexes[i] + 1)).Contains(s) ? s = "\t" + s : s).ToList();
    else
        words = words.Select(s => words.GetRange(indexes[i] + 1, indexes[i + 1] - (indexes[i] + 1)).Contains(s) ? s = "\t" + s : s).ToList();
}