【问题标题】:C# How do I append the previous item in array to the next item in the array for unknown number of items?C#如何将数组中的前一项附加到数组中的下一项以获取未知数量的项?
【发布时间】:2010-09-29 10:24:22
【问题描述】:

对于未知数量的项目,如何将数组中的前一项附加到数组中的下一项?

这就是我想要做的。我有一个包含 LDAP 路径的字符串,例如“OU=3,OU=2,OU=1,DC=Internal,DC=Net”,我想在上面的 LDAP 路径中创建每个容器,所以我需要上面的字符串创建一个包含以下内容的数组,以便我可以创建每个容器。需要先创建第一个数组项,然后才能创建第二个等。

"OU=1,DC=内部,DC=Net"

"OU=2,OU=1,DC=内部,DC=Net"

"OU=3,OU=2,OU=1,DC=内部,DC=Net"

我的字符串示例只是一个示例,因此路径可能更长或更短,并且可能包含 1 个数组项或 10 个以上我只是不知道所以我不知道需要循环遍历多少个数组项它们全部,所以我拥有数组中的所有路径。

另一个例子:

从“OU=Test4,OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net”我需要:

"OU=1,DC=内部,DC=Net" "OU=Item2,OU=1,DC=内部,DC=Net" "OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net" "OU=Test4,OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net"

感谢您的帮助。

J

【问题讨论】:

  • 你可能想让你的例子更清楚,也许通过确定一个字符串的开始和结束位置。
  • 我删除了 ldap 标签,因为这个问题与 LDAP 没有直接关系。
  • 我已经读了 3 遍了,完全是胡言乱语。有编辑权限的人可以清理一下吗?

标签: c# arrays


【解决方案1】:

我的代码和 Martin 的代码差不多,但他的代码在所有路径对象的末尾输出一个逗号。

这是正确的函数:

static string[] SplitLDAPPath(string input)
{
    List<String> r = new List<string>();
    string[] split = input.Split(',');

    string path = "";
    for (int i = split.Length - 1; i >= 0; i--)
    {
        path = split[i] + "," + path;
        if (path.StartsWith("OU"))
            r.Add(path.Substring(0, path.Length-1));
    }
    return r.ToArray();
}

使用:

    String s = "OU=Test4,OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net";
    String[] r = SplitLDAPPath(s);

    foreach (String ss in r)
        lt.Text += ss + "<br/>";

输出:

OU=1,DC=Internal,DC=Net
OU=Item2,OU=1,DC=Internal,DC=Net
OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net
OU=Test4,OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net

【讨论】:

  • 很好,我不会为了提供整个功能而删除它,但我不希望有任何支持...我只是给你我的支持:)
  • 谢谢。顺便说一句:您将方法命名为 SplitLDAPPath(),但在示例中您调用的是 Split()
【解决方案2】:

如果我正确理解您的问题:

  • 用分号分割字符串,生成 N 项
  • 方法的结果应该是多个字符串
  • 第一个字符串应该是最后一项,用分号分割后
  • 下一项应该是最后一项之前的任何内容、分号和最后一项
  • 下一项应该是上一项之前的任何内容,分号,然后是上一项

那么实现应该相当简单:

public static IEnumerable<String> LastToFirstOrSomething(String s)
{
    String[] parts = s.Split(';');
    String result = String.Empty;
    for (Int32 index = parts.Length - 1; index >= 0; index--)
    {
        if (result.Length > 0)
            result = ";" + result;
        result = parts[index] + result;
        yield return result;
    }
}

当然,这可以通过使用 StringBuilder 在性能方面得到改进。

现在,说了这么多,我知道您的问题与我的回答 100% 不匹配,因为您没有说明为什么不提供第一个 X 元素,您跳过这些。这是为什么呢?

您需要提供更多信息以获得更好的答案。

【讨论】:

    【解决方案3】:

    如果字符串总是以“,DC=Internal,DC=Net”结尾,那么下面的解决方案应该可以帮助您。

    static string[] Split(string path)
    {
        const string postfix = ",DC=Internal,DC=Net";
        string shortPath = path.Substring(0, path.Length - postfix.Length);
        return shortPath.Split(',').Select(x => x + postfix).ToArray();
    }
    

    编辑 2.0 解决方案

    static string[] Split(string path)
    {
        const string postfix = ",DC=Internal,DC=Net";
        string shortPath = path.Substring(0, path.Length - postfix.Length);
        string[] items = shortPath.Split(',');
        List<string> final = new List<string>();
        foreach ( string item in items ) { 
          final.Add(item + postfix);
        }
        return final.ToArray();
    
    }
    

    【讨论】:

    • 编译器错误消息:CS1061:“System.Array”不包含“Select”的定义,并且找不到接受“System.Array”类型的第一个参数的扩展方法“Select”(您是否缺少 using 指令或程序集引用?)
    • 您好,感谢您的帮助,我在最后一行遇到错误,无法识别 (x => x + postfix)。我正在使用.Net 2.0。这是 3.5 版的吗?
    • 是的,这是一个 3.5 构造。我将添加一个 2.0 答案。
    • @balexandre,抱歉,这是 C# 3.5 解决方案。我添加了一个 2.0 解决方案。
    【解决方案4】:

    一种方法。这也会为每个 DC 创建一个字符串。

    string[] GetArray(string input)
    {
        string[] vals = input.Split(',');
    
        List<string> entries = new List<string>();
    
        string s;
        for(int i=vals.Length - 1; i > 0; i--)
        {
            s = vals[i];
    
            if(i < vals.Length - 1)
               s += "," +  entries[(vals.Length - 2) - i];
    
            entries.Add(s);
        }
    
       return entries.ToArray();
    }
    

    【讨论】:

      【解决方案5】:

      我不确定我是否理解正确。你需要这样的东西吗:

      string input = "OU=3,OU=2,OU=1,DC=Internal,DC=Net";
      string[] split = input.Split(',');
      
      string path = "";
      for (int i=split.Length-1; i>=0; i--)
      {
          path = ((path == "") ? split[i] : split[i] + "," + path);
          if (path.StartsWith("OU"))
              DoSomething(path);
      }
      

      这将调用 DoSomething() 三次,用于以下字符串:

      • OU=1,DC=内部,DC=Net
      • OU=2,OU=1,DC=内部,DC=Net
      • OU=3,OU=2,OU=1,DC=内部,DC=Net

      【讨论】:

        【解决方案6】:

        这应该会以正确的顺序为您提供一个数组,因为它是一个实际的控制台应用程序,所以要长一点:

        using System;
        using System.Text;
        
        namespace Splitomatic
        {
            public class Program
            {
                /// <summary>
                /// Sample Input: 
                ///    arg[0]: OU=Test4,OU=Number3,OU=Item2,OU=1
                ///    arg[1]: DC=Internal,DC=Net
                /// </summary>
                /// <param name="args"></param>
                public static void Main(string[] args)
                {
                    StringBuilder builder;
                    string[] containers;
                    string[] parts;
        
                    if (args.Length != 2)
                    {
                        Console.WriteLine("Usage: <exe> <containers> <append");
                    }
        
                    builder = new StringBuilder(args[1]);
                    parts = args[0].Split(',');
                    containers = new string[parts.Length];
        
                    for (int i = parts.Length - 1; i >= 0; --i)
                    {
                        builder.Insert(0, ",");
                        builder.Insert(0, parts[i]);
                        containers[Math.Abs(i - parts.Length + 1)] = builder.ToString();
                    }
        
                    Console.WriteLine("Dumping containers[]:");
                    for (int i = 0; i < containers.Length; ++i)
                    {
                        Console.WriteLine("containers[{0}]: {1}", i, containers[i]);
                    }
        
                    Console.WriteLine("Press enter to quit");
                    Console.ReadLine();
                }
            }
        }
        

        样本输出:

        倾倒容器[]: 容器[0]:OU=1,DC=内部,DC=Net 容器[1]:OU=Item2,OU=1,DC=Internal,DC=Net 容器[2]:OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net 容器[3]:OU=Test4,OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net 按回车退出

        【讨论】:

          【解决方案7】:

          这里是代码示例(假设您有 .NET 3.5):

          // First we need to split up the initial string
          string[] items = initialString.Split("'");
          
          // Then we filter it so that we have a list of OU and non-OU items
          string[] ouItems = items.Where(s=>s.StartsWith("OU=")).ToArray();
          string[] nonOuItems = items.Where(s=>!s.StartsWith("OU=")).ToArray();
          
          List<string> mainList = new List<string>();
          
          // Our main loop
          for (int i = 0; i < ouItems.Length; i++)
          {
              List<string> localList = new List<string>();
          
              // We loop through all the previous items including the current one
              for (int j = 0; j <= i; j++)
              {
                  localList.Add(ouItems[i]);
              }
              // Then we add all of the non-OU items
              localList.AddRange(nonOuItems);
          
              // Then we build the string itself
              bool first = true;
              StringBuilder sb = new StringBuilder();
              foreach (string s in localList)
              {
                  if (first) first = false;
                  else sb.Append (","); // Separating the items with commas
                  sb.Append(s);
              }
              mainList.Add(sb.ToString());
          }
          
          // Now we only have to convert it back to an array
          string[] finalArray = mainList.ToArray();
          

          即使您没有 .NET 3.5,将其移植回 .NET 2.0 也应该非常简单。另外,我没有对此进行测试,因此可能存在错误或拼写错误。此外,这绝对不是最有效的方法,但我认为这很明显并且可能会奏效。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-11-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-29
            • 2021-07-21
            相关资源
            最近更新 更多