如何在C#中从两者的组合中提取整数和二维整数数组

时间:2011-06-27 04:37:48

标签: c# arrays

我的输入

2:{{2,10},{6,4}} 

我正在读这个

string input = Console.ReadLine();

接下来,此输入必须传递给函数

GetCount(int count, int[,] arr)
{

}

我怎样才能使用C#?

由于

3 个答案:

答案 0 :(得分:1)

您可以使用RegularExpressions以简单的方式提取输入字符串的每个标记。在以下示例中,还包括对额外空格的支持(正则表达式中的\ s *)。

请记住,让一个类负责解析(在本例中)而不是采用程序方法总是一个好主意。

所有相关的评论都被评论以便更好地理解。

最后,我对此进行了测试并使用提供的示例输入字符串。

using System;
using System.Text.RegularExpressions;

namespace IntPairArrayParserDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = "2:{{2,10},{6,4}}";
            ParseAndPrintArray(input);

            var anotherInput = "2  : { { 2 , 10 } , { 6 , 4 } }";
            ParseAndPrintArray(anotherInput);
        }

        private static void ParseAndPrintArray(string input)
        {
            Console.WriteLine("Parsing array {0}...", input);

            var array = IntPairArrayParser.Parse(input);

            var pairCount = array.GetLength(0);
            for (var i = 0; i < pairCount; i++)
            {
                Console.WriteLine("Pair found: {0},{1}", array[i, 0], array[i, 1]);
            }
            Console.WriteLine();
        }
    }

    internal static class IntPairArrayParser
    {
        public static int[,] Parse(string input)
        {
            if (string.IsNullOrWhiteSpace(input)) throw new ArgumentOutOfRangeException("input");

            // parse array length from string
            var length = ParseLength(input);

            // create the array that will hold all the parsed elements
            var result = new int[length, 2];

            // parse array elements from input
            ParseAndStoreElements(input, result);

            return result;
        }

        private static void ParseAndStoreElements(string input, int[,] array)
        {
            // get the length of the first dimension of the array
            var expectedElementCount = array.GetLength(0);

            // parse array elements
            var elementMatches = Regex.Matches(input, @"{\s*(\d+)\s*,\s*(\d+)\s*}");

            // validate that the number of elements present in input is corrent
            if (expectedElementCount != elementMatches.Count)
            {
                var errorMessage = string.Format("Array should have {0} elements. It actually has {1} elements.", expectedElementCount, elementMatches.Count);
                throw new ArgumentException(errorMessage, "input");
            }

            // parse array elements from input into array
            for (var elementIndex = 0; elementIndex < expectedElementCount; elementIndex++)
            {
                ParseAndStoreElement(elementMatches[elementIndex], elementIndex, array);
            }
        }

        private static void ParseAndStoreElement(Match match, int index, int[,] array)
        {
            // parse first and second element values from the match found
            var first = int.Parse(match.Groups[1].Value);
            var second = int.Parse(match.Groups[2].Value);

            array[index, 0] = first;
            array[index, 1] = second;
        }

        private static int ParseLength(string input)
        {
            // get the length from input and parse it as int
            var lengthMatch = Regex.Match(input, @"(\d+)\s*:");
            return int.Parse(lengthMatch.Groups[1].Value);
        }
    }
}

答案 1 :(得分:0)

不要为你工作,你首先必须解析整个字符串以找到单个整数,或者使用正则表达式,或者像我自己一样,{{1 }} 方法。然后使用string.Splitint.Parse方法解析表示各个整数的子字符串。

答案 2 :(得分:0)

我怀疑你是否会为自定义格式获得一个严肃的解析答案。如果您需要以这种方式输入值,我会查找有关正则表达式的一些信息。如果这对你来说不够强大,你可以使用一些相当方便的解析器生成器。

或者,更现实的想法是这样的:

(注意:根本没试过......甚至没把它放在VS ......但这是个主意...)

int rows = 0;
string rowsInput = "";
do {
    Console.Write("Number of rows:");
    rowsInput = Console.ReadLine();
} while (!Int32.TryParse(rowsInput, out rows);

int columns = 0;
string columnsInput = "";
do {
    Console.Write("Number of columns:");
    string columnsInput = Console.ReadLine();
} while (!Int32.TryParse(columnsInput, out columns);

List<List<int>> values = new List<List<int>>();

for (int i = 0; i < rows; i++)
{
    bool validInput = false;
    do {
        Console.Write(String.Format("Enter comma-delimited integers for row #{0}:", i.ToString()));
        string row = Console.ReadLine();
        string[] items = row.split(',');
        int temp;
        validInput = (items.Length == columns) && (from item in items where  !Int32.TryParse(item, out temp) select item).count() == 0;
        if (validInput)
        {
            values.add(
                    (from item in items select Convert.ToInt32(item)).ToList()
            );
        }
    } while (!validInput);
}