【问题标题】:How to turn values in variables into array indexes如何将变量中的值转换为数组索引
【发布时间】:2021-11-05 20:44:33
【问题描述】:

希望我能解释清楚……我有一个变量集合:

static string sRunnerSetName, sFH, sR1, sH2, sR2, sH3, sR3, sH4, sR4, sH5, sR5 = "";
static int iRunnerSetName, iFH, iR1, iH2, iR2, iH3, iR3, iH4, iR4, iH5, iR5 = 0;

每个 int 变量都有一个唯一值,它提供了相应的 string 变量需要组合并放入连接字符串的顺序。所以 iFH 保存了字符串 sFH 将在连接字符串中的位置的排序/订单号位置。

我只是不知道如何使用每个 int 中的值来创建字符串的顺序?

举个例子-

 iFH = 2; i1R = 0; i2R = 1;
 sFH = "z"; s1R = "x"; s2R = "y";

希望使用整数变量中的值来创建每个字符串的顺序/位置,以便上述的连接结果为“xyz”。

【问题讨论】:

  • 也许可以提供一个例子,因为我已经阅读了你的问题两次,但我仍然不知道你在问什么。
  • 对不起,我一直想弄清楚如何正确提问。我举个例子。
  • 是否有必要将您的值存储在专用变量中?我会将它们存储在一个数组中,而不是通过它们进行迭代更容易做任何你想做的事情。也可以这样做,但你不想走我认为的“反思方式”
  • 通常我会这样做,但整数值是从作为列集合的外部文件(制表符分隔的列表文件)引入的,整数是每列的数字。
  • 为什么这意味着您不能将它们存储在数组中?只需将索引设为列号

标签: c# variables concatenation


【解决方案1】:

创建一个包含字符串和 int 的类:

class Item
{
    public string Description {get;set;}
    public int SortOrder {get;set;}
}

为这些项目创建一个列表(或另一个更适合您需要的集合):

List<Item> list = new List<Item>
{
   new Item { Description = "Test", SortOrder = 4 },
   new Item { Description = "Test2", SortOrder = 3 },
   new Item { Description = "sadf", SortOrder = 1 },
   new Item { Description = "Example", SortOrder = 2 },
   new Item { Description = "something", SortOrder = 5 }
};

您可以使用 LINQ 对列表进行排序:

list = list.OrderBy(x => x.SortOrder).ToList();

然后你可以在控制台上输出它:

Console.WriteLine(string.Join("\n", list.Select(x => x.Description)));

Try it online

【讨论】:

  • 次要注意:如果我们不关心保留原始列表顺序以求繁荣:list.Sort(static (x, y) =&gt; x.SortOrder.CompareTo(y.SortOrder)); 会更高效(就地排序,无需额外分配)
  • 我只是用这个添加了一个东西......我把它放入一个新变量中以便能够删除换行符,这样我就可以将它全部输出到一行中,所以它由制表符分隔,而不是换行。 string strOutputLine = string.Join("\t", list.Select(x =&gt; x.Description)); strOutputLine = strOutputLine.Replace("\r", ""); 我敢肯定有更好的方法来做到这一点,但对 C# 来说很新:)
【解决方案2】:

可以在这里使用数组;将数据复制到数组中,然后使用索引一作为主数据对它们进行排序:

        string a = "a", b = "b", c = "c", d = "d";
        int ia = 3, ib = 2, ic = 0, id = 1;

        
        string[] sarr = null;
        int[] iarr = null;
        try
        {
            // put the data into vectors; we can't talk about variables
            // abstractly, but we *can* talk about vectors by position
            sarr = ArrayPool<string>.Shared.Rent(4);
            iarr = ArrayPool<int>.Shared.Rent(4);
            sarr[0] = a;
            sarr[1] = b;
            sarr[2] = c;
            sarr[3] = d;
            iarr[0] = ia;
            iarr[1] = ib;
            iarr[2] = ic;
            iarr[3] = id;

            var sb = new StringBuilder();
            Array.Sort(iarr, sarr, 0, 4);
            for (int i = 0; i < 4; i++)
            {
                sb.Append(sarr[i]);
            }
            sb.AppendLine();
            Console.WriteLine(sb.ToString());
        }
        finally
        {
            if (sarr is not null) ArrayPool<string>.Shared.Return(sarr);
            if (iarr is not null) ArrayPool<int>.Shared.Return(iarr);
        }

效率不是很高,但它会起作用。但是,重新定义问题可能会更好。从你的例子:

iFH = 2; i1R = 0; i2R = 1;
sFH = "z"; s1R = "x"; s2R = "y";

如果我们改为:

string[] sarr = { "z", "x", "y"};

现在按位置讨论你想要什么标记

int[] iarr = { 1, 2, 0 };

现在您可以使用:

foreach (int i in iarr) {
    sb.Append(sarr[i]);
}

【讨论】:

    【解决方案3】:

    一种可能的解决方案:像这样使用 SortedDictionary

            int iFH = 2, i1R = 0, i2R = 1;
            string sFH = "z", s1R = "x", s2R = "y";
    
            var map = new SortedDictionary<int, string>();
            map[iFH] = sFH;
            map[i1R] = s1R;
            map[i2R] = s2R;
    
            var result = string.Join("", map.Values);
    

    【讨论】:

      【解决方案4】:

      如果我理解正确,您的意思是使用 int 值作为字符串数组中的订单号。由于 int 值是 int 类型,因此您可以直接将它们用作值。例如,假设您有一个名为 stringArray 的字符串数组,

      stringArray[iFH] = sFH;
      

      对所有字符串执行此操作可以创建一个有序数组。要将它们全部连接起来,您可以通过以下方式遍历数组并将它们添加到单独的字符串中:

      String finalString = "";
      for(int i = 0; i < stringArray.Length; i++){
      
          finalString = finalString + stringArray[i];
      
      }
      
      console.WriteLine(finalString);
      

      【讨论】:

        【解决方案5】:

        把问题一分为二

        1. 将任意长的随机变量列表转换为 数组
        2. 使用数组创建串联字符串

        对于第 1 部分,创建一个带参数的函数

        public static string[] StringList(params object[] stringValues) => stringValues.Cast<string>().ToArray();
        
        public static int[] PositionList(params object[] intValues) => intValues.Cast<int>().ToArray();
        

        第 2 部分

        public static string Join(string[] text, int[] positions)
        {
            string[] final = new string[text.Length];
            for (int i = 0; i < text.Length; i++)
            {
                final[positions[i]] = text[i];
            }
            return string.Join("", final);
        }
        

        然后像这样运行:

        public static string RunExample()
        {
            string sFH = "z"; string s1R = "x"; string s2R = "y";
            int iFH = 2; int i1R = 0; int i2R = 1;
            return Join(StringList(sFH, s1R, s2R), PositionList(iFH, i1R, i2R));
        }
        

        整个例子:

        public static class Joiner
        {
            public static string[] StringList(params object[] stringValues) => stringValues.Cast<string>().ToArray();
        
            public static int[] PositionList(params object[] intValues) => intValues.Cast<int>().ToArray();
        
            public static string Join(string[] text, int[] positions)
            {
                string[] final = new string[text.Length];
                for (int i = 0; i < text.Length; i++)
                {
                    final[positions[i]] = text[i];
                }
                return string.Join("", final);
            }
        
            public static string RunExample()
            {
                string sFH = "z"; string s1R = "x"; string s2R = "y";
                int iFH = 2; int i1R = 0; int i2R = 1;
                return Join(StringList(sFH, s1R, s2R), PositionList(iFH, i1R, i2R));
            }
        }
        

        您可以添加自己的异常处理代码(数组大小不匹配等)。

        【讨论】:

          猜你喜欢
          • 2011-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-23
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多