C#:如何使用变化的前缀拆分字符串

时间:2018-08-22 17:06:31

标签: c# .net split

你好,我看了几篇有关该主题的文章,但没有答案可以帮助我。

我提取有关各种机器的数据,如下所示:

"time, M1.A, M1.B, M1.C, M2.A, M2.B, M2.C, M3.A, M3.B, M3.C"

M1是指定哪台计算机的前缀。 A,B,C是这台机器的属性,例如温度,压力等。

输出应如下所示:

{{"time", "M1.A", "M1.B", "M1.C"}, {"time", "M2.A",....}}

我知道我可以在“,”处分割,然后创建列表,但是我想知道是否还有另一种方法来检测前缀是否更改。

4 个答案:

答案 0 :(得分:1)

Regex.Matches(myList, @"M(?<digit>\d+)\..") //find all M1.A etc
    .Cast<Match>() //convert the resulting list to an enumerable of Match
    .GroupBy(m => m.Groups["digit"].Value) //find the groups with the same digits
    .Select(g => new[] { "time" }.Union(g.Select(m => m.Value)).ToArray());
    //combine the groups into arrays beginning with "time"

答案 1 :(得分:1)

您提到“输出应该看起来像这样……”,但是随后您提到一个列表,因此我将假设您的意思是将原始字符串变成字符串列表。

List<string> split = new List<string>(s.Split(','));
string first = split[0];
split.RemoveAt(0);
List<List<string>> result = new List<List<string>>();
foreach (var dist in split.Select(o => o.Split('.')[0]).Distinct())
{
    List<string> temp = new List<string> {first};
    temp.AddRange(split.Where(o => o.StartsWith(dist)));
    result.Add(temp);
}

这将执行原始拆分,删除第一个值(我假设您没有真正指定的值),然后在每台计算机周围循环。通过将每个值进一步用“。”分隔来创建机器。并列出不同的清单然后,它选择列表中所有以机器开头的值,并将它们与第一个值一起添加到结果列表中。

答案 2 :(得分:1)

我使用正则表达式创建了一个词典:

           string input = "time, M1.A, M1.B, M1.C, M2.A, M2.B, M2.C, M3.A, M3.B, M3.C";
            string pattern1 = @"^(?'name'[^,]*),(?'machines'.*)";
            Match match1 = Regex.Match(input, pattern1);
            string name = match1.Groups["name"].Value;
            string machines = match1.Groups["machines"].Value.Trim();

            string pattern2 = @"\s*(?'machine'[^.]*).(?'attribute'\w+)(,|$)";
            MatchCollection matches = Regex.Matches(machines, pattern2);

            Dictionary<string, List<string>> dict = matches.Cast<Match>()
                .GroupBy(x => x.Groups["machine"].Value, y => y.Groups["attribute"].Value)
                .ToDictionary(x => x.Key, y => y.ToList());

答案 3 :(得分:0)

为您提供一些快速示例。我认为最好以自己的方式解析它,并具有Machine-Attribute对的字符串结构。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp4 {
    class Program {
        static void Main(string[] args) {
            string inputString = "time, M1.A, M1.B, M1.C, M2.A, M2.B, M2.C, M3.A, M3.B, M3.C";

            string[] attrList = inputString.Split(',');

            // 1. Get all machines with attributes
            List<MachineAttribute> MachineAttributeList = new List<MachineAttribute>();
            for (int i = 1; i < attrList.Length; i++) {
                MachineAttributeList.Add(new MachineAttribute(attrList[i]));
            }

            // 2. For each machine create 
            foreach (var machine in MachineAttributeList.Select(x=>x.Machine).Distinct()) {
                Console.Write(attrList[0]);
                foreach (var attribute in MachineAttributeList.Where(x=>x.Machine == machine)) {
                    Console.Write(attribute + ",");
                }
                Console.WriteLine();
            }

            Console.ReadLine();
        }
    }

    public class MachineAttribute {
        public string Machine { get; }

        public string Attribute { get; }

        public MachineAttribute(string inputData) {
            var array = inputData.Split('.');
            if (array.Length > 0) Machine = array[0];
            if (array.Length > 1) Attribute = array[1];
        }

        public override string ToString() {
            return Machine + "." + Attribute;
        }
    }
}