如何基于列表样式键创建串联的字符串值列表?

时间:2012-11-21 18:56:58

标签: c# list dictionary key-value string-concatenation

我有一本包含以下数据的字典:

Key    Value
1      Introduction
1.1    General
1.1.1  Scope
1.2    Expectations
2      Background
2.1    Early Development
...

我想要做的是找出一种方法 - 在C#中 - 创建一个新列表(或附加到数组),其中的值根据列表样式键连接起来,如下所示:

Key    Value              Concatenation
1      Introduction       Introduction
1.1    General            Introduction - General
1.1.1  Scope              Indroduction - General - Scope
1.2    Expectations       Introduction - Expectations
2      Background         Background
2.1    Early Development  Background - Early Development
...

密钥没有设定的子级别数,但它始终采用数字格式。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

这显然需要清理并提高效率,但您可以使用递归方法完成此操作:

static string GetConcatenationRecursively(Dictionary<string, string> d, string key)
{
    if (key.Length == 1)
    {
        return d[key];
    }
    else
    {
        return string.Format(
            "{0} - {1}",
            GetConcatenationRecursively(d, key.Substring(0, key.LastIndexOf('.'))),
            d[key]);
    }
}

这将被称为:

Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("1", "Introduction");
d.Add("1.1", "General");
d.Add("1.1.1", "Scope");
d.Add("1.2", "Expectations");
d.Add("2", "Background");
d.Add("2.1", "Early Development");

List<Tuple<string, string, string>> list = new List<Tuple<string, string, string>>();
foreach (string key in d.Keys)
{
    list.Add(new Tuple<string, string, string>(key, d[key], GetConcatenationRecursively(d, key)));
}

也需要大量的错误处理;这显然假设了良好的输入。但你应该可以从这里拿走它。

答案 1 :(得分:0)

这个解决方案可能不是你能想到的最漂亮的解决方案,但是如果你知道你的要求真的那么简单,那么你可能不想过度介绍它而只是像这种方法那样直接进行一些事情。 - 请注意,大多数代码只是样板,以正确呈现“ - ”部分;实际的算法部分代码不多:

var dic = new Dictionary<string, string>();
      dic.Add("1", "Introduction");
      dic.Add("1.1", "General");
      dic.Add("1.1.1", "Scope");
      dic.Add("1.2", "Expectations");
      dic.Add("2", "Background");
      dic.Add("2.1", "Early Development");

      foreach (var kvp in dic)
      {
        string item = String.Empty;

        int length = kvp.Key.Length - 2;
        while (length > 0)
        {
          var parent = dic[kvp.Key.Substring(0, length)];
          if (!String.IsNullOrEmpty(item))
            item = String.Format("{0} - {1}", parent, item);
          else
            item = parent;
          length -= 2;
        }
        if (!String.IsNullOrEmpty(item))
          item = String.Format("{0} - {1}", item, kvp.Value);
        else
          item = kvp.Value;
        Console.WriteLine(item);
      }

答案 2 :(得分:0)

如果您只需要输出显示,请使用 Maate 的答案。如果你在集合中需要这个,下面是一个开始(但它只升级一级):

Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("1", "Introduction");
d.Add("1.1", "General");
d.Add("1.1.1", "Scope");
d.Add("1.2", "Expectations");
d.Add("2", "Background");
d.Add("2.1", "Early Development");

var links = from key in d.Keys
            from subKey in d.Keys
            where subKey.StartsWith(key) && (subKey.Length == key.Length + 2)
            select new
            {
                Key = key,
                SubKey = subKey
            };

var a = from key in d.Keys
        join link in links on key equals link.SubKey into lj
        from sublink in lj.DefaultIfEmpty()
        select new
        {
            Key = key,
            Value = d[key],
            Concatenation = (sublink == null ? string.Empty : d[sublink.Key] + " - ") + d[key]
        };

它获取链接,然后使用字典中的左连接到链接以获取连接。就像我说的那样,它只提升了一级,所以这不是一个完整的解决方案。需要无限递归。

答案 3 :(得分:-2)

在字符串中放置一个分隔符,可以将其拆分,通常是分号(;)。但你可以使用更多。

如果使用分号,请务必将其从字符串中剥离。