繁体   English   中英

如何从字符串数组中取出所有 int 值并将该 int 值存储在另一个数组中

[英]How to out all the int values from a string array and store that int values in another array

字符串数组中有单词和 int 值。 我的目标是从另一个数组中检索 int 值。 我已经看到了两种从字符串数组转换和查找 int 值的方法。

要从字符串中获取所有 int 值,我首先创建另一个 int 数组并使用 Array.ConvertAll init。 第二种方法是循环通过isDigit()。

现在,问题是我找不到将值存储在已转换为 int 的 int 数组中的方法。 最终目标是从转换后的值中找到最小值和最大值。

string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };
int result;
int[] num = Array.ConvertAll(strArray1, x =>
{
    bool convertStrIntoInt = int.TryParse(x, out  int result);
    return result;
});

在这里,我不知道如何得到它之外的结果来进行排序以找到最小值和最大值。

我不明白你想要什么,但如果你只想要 int 那就用这个

 List<int> list = new List<int>();
        string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };
        foreach (string str in strArray1)
        {
            if (int.TryParse(str, out int val))
            {
                list.Add(val);
            }
        }
        int[] vs = list.ToArray();  

现在所有的 int 值都存储在 vs 数组中,如果有一些包含 int 值的单词并且您希望它们被提取,您也可以使用正则表达式来查找单词中的数字

我会为此使用 LINQ :

string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };

int[] num =
(
    from x in strArray1
    let n = int.TryParse(x, out int n) ? (int?)n : null
    where n.HasValue
    select n.Value
).ToArray();

输出:

数

然后你可以这样做:

int max = num.Max();
int min = num.Min();

您可以尝试如下正则Regex

string[] strArray1 = {"Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109"};

int[] num = strArray1.Where(v => Regex.IsMatch(v, @"^\d+$")).Select(int.Parse).ToArray();


int min = num.Min();
int max = num.Max();

由于您不想使用Regex ,您可以 go 使用您的解决方案,只需进行小修改即可获得所需的结果。 尝试这个:

string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };
int[] num = Array.ConvertAll(strArray1, x =>
{
    bool convertStrIntoInt = int.TryParse(x, out int result);
    return result;
}).Where(x => x > 0).ToArray();

int max = num.OrderByDescending(c => c).ToArray()[0];
int min = num.OrderBy(c => c).ToArray()[0];

小的优化解决方案可能如下所示

string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };
var numArray = strArray1.Where(var=> new Regex(@"^\d+").IsMatch(var)).ToArray();
var res = Array.ConvertAll(numArray,s => int.Parse(s));

如果我们不想使用正则表达式可以尝试如下

string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };
int testNum;
var numArray = strArray1.Where(var=> int.TryParse(var,out testNum)).ToArray();
var res = Array.ConvertAll(numArray,s => int.Parse(s));

然后,您可以使用获取最大值和最小值

res.Min(), res.Max()

这应该为您的问题提供一个起点

这是将字符串数组中的 int 值转换为 int 数组的另一种方法。

dotnetfiddle上试试。

public static class Extensions
{
    public static int[] ToIntegerArray(this string[] sender)
    {

        var intArray = Array
            .ConvertAll(sender,
                (input) => new {
                    IsInteger = int.TryParse(input, out var integerValue),
                    Value = integerValue
                })
            .Where(result => result.IsInteger)
            .Select(result => result.Value)
            .ToArray();

        return intArray;

    }
}

利用

string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };
int[] intArray = strArray1.ToIntegerArray();
Array.Sort(intArray);
foreach (var value in intArray)
{
    Console.WriteLine(value);
}

Console.WriteLine($"Min: {intArray.Min()}");
Console.WriteLine($"Max: {intArray.Max()}");

针对您的初始问题:

我不 [知道] 如何在它之外获取结果以进行排序以找到最小值和最大值。

使用带有“正常” intConvertAll() ,您根本无法为您的问题获得完整的解决方案。

因此,如果我们看一下您的结果:

int[] num = Array.ConvertAll(strArray1, x =>
{
    bool convertStrIntoInt = int.TryParse(x, out int result);
    return result;
});

// num: int[8] { 0, 99, 0, 3, 0, 12, 0, 109 }

我们可以看到每个string都会产生0 ,因为如果解析失败,将返回0 - 请参阅: Int32.TryParse(...) 因此,无法区分输入中的真实0或字符串。

但是我们可以通过使用Nullable<int> / int?

int?[] num = Array.ConvertAll(strArray1, x =>
{
    return (int?)( int.TryParse(x, out  int result) ? result : null);
});

// num: Nullable<int>[8] { null, 99, null, 3, null, 12, null, 109 }

因此,我们可以区分0和字符串 - 由null表示。

现在您可以执行其他操作,例如num.Max()num.Min() 如果您需要一个int[]数组,则必须运行更多循环。

int[] num = Array.ConvertAll(strArray1, x =>
{
    return (int?)( int.TryParse(x, out  int result) ? result : null);
}).OfType<int>().ToArray();

//num: int[4] { 99, 3, 12, 109 }

所以这不是很理想。


我的解决方案是一个简单的循环。

// Your intput
string[] strArray1 = { "Bautik", "99", "Sagar", "3", "Tisha", "12", "Riya", "109" };

// Output Variables
List<int> result = new();
int min = int.MaxValue; 
int max = int.MinValue;

// Loop
foreach( string item in strArray1)
{ 
    if(int.TryParse(item, out int value))
    { 
        result.Add(value);
        min = min > value ? value : min;
        max = max < value ? value : max;
     }
}

// Output
// result: int[4] { 99, 3, 12, 109 }
// min: 3
// max: 109

正如Gian Paolo在这个答案评论中已经提到的那样

使用List<int>比使用int[]容易得多

...,但如果你真的需要一个数组,那么你可以调用ToArray()

int[] resultArray = result.ToArray(); 

这导致int[4] { 99, 3, 12, 109 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM