1

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

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

4 回答 4

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)));
}

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

于 2012-11-21T19:37:08.703 回答
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);
      }
于 2012-11-21T19:23:00.043 回答
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]
        };

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

于 2012-11-21T19:27:44.770 回答
-2

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

如果您使用分号,请确保将它们从字符串中剥离出来。

于 2012-11-21T19:01:54.937 回答