C#如何将数组中的上一项附加到数组中的下一个项目,以获取未知数量的项目?

时间:2009-01-03 23:37:11

标签: c# arrays

如何将数组中的上一项附加到数组中的下一项中,以获取未知数量的项目?

这是我正在尝试做的事情。我有一个包含LDAP路径的字符串,例如“OU = 3,OU = 2,OU = 1,DC = Internal,DC = Net”,我想在上面的LDAP路径中创建每个容器,所以我需要从上面的字符串创建一个包含下面内容的数组,这样我就可以创建每个容器。在我可以创建第二个数组等之前,需要创建第一个数组项。

“OU = 1,DC =内部,DC =净”

“OU = 2,OU = 1,DC =内部,DC =净”

“OU = 3,OU = 2,OU = 1,DC =内部,DC =净”

我的字符串示例只是一个示例,因此路径可能更长或更短,可能包含1个数组项或10+我只是不知道所以我不知道有多少数组项我需要循环所有这些都让我拥有阵列中的所有路径。

另一个例子:

从“OU = Test4,OU = Number3,OU = Item2,OU = 1,DC =内部,DC =净”我需要:

“OU = 1,DC =内部,DC =净” “OU =项目2,OU = 1,DC =内部,DC =净” “OU = 3号,OU =项目2,OU = 1,DC =内部,DC =净” “OU = TEST4,OU = 3号,OU =项目2,OU = 1,DC =内部,DC =净”

感谢您的帮助。

Ĵ

7 个答案:

答案 0 :(得分:4)

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

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 =净
  • OU = 2,OU = 1,DC =内部,DC =净
  • OU = 3,OU = 2,OU = 1,DC =内部,DC =净

答案 1 :(得分:0)

如果字符串始终以“,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();

}

答案 2 :(得分:0)

这是代码示例(假设您有.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也应该非常简单。另外,我还没有对此进行测试,因此可能存在错误或拼写错误。此外,这绝对不是最有效的方法,但我认为这很明显,可能会有效。

答案 3 :(得分:0)

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

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

示例输出:

Dumping containers[]:
containers[0]: OU=1,DC=Internal,DC=Net
containers[1]: OU=Item2,OU=1,DC=Internal,DC=Net
containers[2]: OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net
containers[3]: OU=Test4,OU=Number3,OU=Item2,OU=1,DC=Internal,DC=Net
Press enter to quit

答案 4 :(得分:0)

一种方法。这也将为每个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 :(得分:0)

我的代码几乎和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

答案 6 :(得分:0)

如果我理解你的问题:

  • 在分号上拆分字符串,生成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个元素,你跳过那些。那是为什么?

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