.net 从字符串中拆分整数

.net 从字符串中拆分整数,.net,string,.net-2.0,.net,String,.net 2.0,假设我有一个网页,当前通过url参数接受单个ID值: 我想将其更改为接受ID列表,如下所示: 因此,我的代码可以通过context.Request.QueryString[“IDs”]将其作为字符串使用。将该字符串值转换为列表的最佳方法是什么 Edit:我知道如何使用逗号.split()来获取字符串列表,但我问这个问题是因为我不知道如何轻松地将该字符串列表转换为int列表。这仍然在.Net 2.0中,因此没有lambda。从URL中提取值后,可以使用string.Split()拆分这些值 s

假设我有一个网页,当前通过url参数接受单个ID值:

我想将其更改为接受ID列表,如下所示:

因此,我的代码可以通过context.Request.QueryString[“IDs”]将其作为字符串使用。将该字符串值转换为列表的最佳方法是什么

Edit:我知道如何使用逗号.split()来获取字符串列表,但我问这个问题是因为我不知道如何轻松地将该字符串列表转换为int列表。这仍然在.Net 2.0中,因此没有lambda。

从URL中提取值后,可以使用string.Split()拆分这些值

string[] splitIds = ids.split(',');

我所能想到的就是在字符串列表上循环(这是执行拆分得到的),然后依次对它们执行类似于
int.TryParse()
的操作,并将它们放入新的
列表中。将它封装在一个很好的小助手方法中,这样就不会太可怕了。

您只需对它们进行foreach并对它们中的每一个进行int.TryParse。之后,只需添加到列表中

别担心-@Splash比我快

你可以从数组中实例化一个列表

VB.NET:

Dim lstIDs as new List(of Integer)(ids.split(','))

如果数组包含非int元素,则很容易出现强制转换错误。首先想到的是拆分,但它返回的是数组,而不是列表; 您可以尝试以下方法:


List<int> intList = new List<int>;

foreach (string tempString in ids.split(',')
{
    intList.add (convert.int32(tempString));
}


List intList=新列表;
foreach(id.split(',')中的字符串tempString)
{
intList.add(convert.int32(tempString));
}

类似的方法可能会奏效:

public static IList<int> GetIdListFromString(string idList)
{
    string[] values = idList.Split(',');

    List<int> ids = new List<int>(values.Length);

    foreach (string s in values)
    {
        int i;

        if (int.TryParse(s, out i))
        {
            ids.Add(i);
        }
    }

    return ids;
}
公共静态IList GetIdListFromString(字符串idList)
{
字符串[]值=idList.Split(',');
列表ID=新列表(值.Length);
foreach(值中的字符串s)
{
int i;
if(内锥虫(s,外锥虫)
{
同上,添加(i);
}
}
返回ID;
}
然后将使用:

string intString = "1234,4321,6789";

IList<int> list = GetIdListFromString(intString);

foreach (int i in list)
{
    Console.WriteLine(i);
}
string intString=“123443216789”;
IList list=GetIdListFromString(intString);
foreach(列表中的int i)
{
控制台写入线(i);
}
List convertIDs=新列表;
字符串[]splitIds=ids.split(',');
foreach(splitIds中的字符串s)
{
convertIDs.Add(int.Parse(s));
}
为了完整性,您需要在For循环(或int.Parse()调用)周围放置try/catch,并根据您的要求处理错误。您还可以执行tryparse()操作,如下所示:

List convertIDs=新列表;
字符串[]splitIds=ids.split(',');
foreach(splitIds中的字符串s)
{
int i;
内锥虫(外i);
如果(i!=0)
添加(i);
}

继续上一个答案,非常简单地迭代通过拆分返回的数组并转换为新的整数数组。下面的C#示例:

string[]splitIds=stringIds.Split(',');
int[]ids=新的int[splitIds.Length];
for(int i=0;i
如果您喜欢功能性风格,您可以尝试以下方式

    string ids = "1,2,3,4,5";

    List<int> l = new List<int>(Array.ConvertAll(
        ids.Split(','), new Converter<string, int>(int.Parse)));
string id=“1,2,3,4,5”;
列表l=新列表(Array.ConvertAll)(
拆分(',),新的转换器(int.Parse));

没有lambda,但是您确实有转换器和谓词以及其他可以从方法生成的好东西。

我认为最简单的方法是如前所示拆分,然后循环遍历这些值并尝试转换为int

class Program
{
    static void Main(string[] args)
    {
        string queryString = "1234,4321,6789";

        int[] ids = ConvertCommaSeparatedStringToIntArray(queryString);
    }

    private static int[] ConvertCommaSeparatedStringToIntArray(string csString)
    {
        //splitting string to substrings
        string[] idStrings = csString.Split(',');

        //initializing int-array of same length
        int[] ids = new int[idStrings.Length];

        //looping all substrings
        for (int i = 0; i < idStrings.Length; i++)
        {
            string idString = idStrings[i];

            //trying to convert one substring to int
            int id;
            if (!int.TryParse(idString, out id))
                throw new FormatException(String.Format("Query string contained malformed id '{0}'", idString));

            //writing value back to the int-array
            ids[i] = id;
        }

        return ids;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串queryString=“123443216789”;
int[]id=ConvertCommaSeparatedStringToIntArray(查询字符串);
}
私有静态int[]ConvertCommaseParatedStringToInArray(字符串csString)
{
//将字符串拆分为子字符串
string[]idStrings=csString.Split(',');
//初始化相同长度的int数组
int[]ids=新的int[idStrings.Length];
//循环所有子字符串
对于(int i=0;i
对那些提供明确答案的人没有冒犯之意,但许多人似乎在回答你的问题,而不是解决你的问题。你想要多个ID,因此你认为你可以这样:

问题是,这是一个不可靠的解决方案。将来,如果您想要多个值,如果它们有逗号,您该怎么办?更好的解决方案(这在查询字符串中完全有效)是使用多个同名参数:


然后,您使用的任何查询字符串解析器都应该能够返回一个ID列表。如果它不能处理这个问题(也不能处理分号而不是符号),那么它就坏了。

最后的代码片段,我希望从所有建议中得到最好的结果:

Function GetIDs(ByVal IDList As String) As List(Of Integer)
    Dim SplitIDs() As String = IDList.Split(new Char() {","c}, StringSplitOptions.RemoveEmptyEntries)
    GetIDs = new List(Of Integer)(SplitIDs.Length)
    Dim CurID As Integer
    For Each id As String In SplitIDs
        If Integer.TryParse(id, CurID) Then GetIDs.Add(CurID)
    Next id
End Function
我希望能够在一行或两行内联代码中完成这项工作。一行代码用于创建字符串数组,并希望在框架中找到一些我还不知道的东西,以便将其导入到可以智能处理转换的列表中。但是如果我必须将其移动到一个方法中,那么我会的。是的,我正在使用VB。我只是更喜欢C#for ask因为他们会有更多的听众,所以我的提问也很流利。

我知道提问来得很晚,也就是说,其他几个人也写了同样的问题。因此,我提出了一种使用正则表达式验证和分割字符串的替代方法

class Program
{
    //Accepts one or more groups of one or more digits, separated by commas.
    private static readonly Regex CSStringPattern = new Regex(@"^(\d+,?)*\d+$");

    //A single ID inside the string. Must only be used after validation
    private static readonly Regex SingleIdPattern = new Regex(@"\d+");

    static void Main(string[] args)
    {
        string queryString = "1234,4321,6789";

        int[] ids = ConvertCommaSeparatedStringToIntArray(queryString);
    }

    private static int[] ConvertCommaSeparatedStringToIntArray(string csString)
    {
        if (!CSStringPattern.IsMatch(csString))
            throw new FormatException(string.Format("Invalid comma separated string '{0}'",
                                                    csString));

        List<int> ids = new List<int>();
        foreach (Match match in SingleIdPattern.Matches(csString))
        {
            ids.Add(int.Parse(match.Value)); //No need to TryParse since string has been validated
        }
        return ids.ToArray();
    }
}
类程序
{
//接受由一个或多个数字组成的一组或多组,用逗号分隔。
私有静态只读Regex CSStringPattern=newregex(@“^(\d+,?)*\d+$”);
//字符串中的单个ID。只能在验证后使用
私人静电
class Program
{
    static void Main(string[] args)
    {
        string queryString = "1234,4321,6789";

        int[] ids = ConvertCommaSeparatedStringToIntArray(queryString);
    }

    private static int[] ConvertCommaSeparatedStringToIntArray(string csString)
    {
        //splitting string to substrings
        string[] idStrings = csString.Split(',');

        //initializing int-array of same length
        int[] ids = new int[idStrings.Length];

        //looping all substrings
        for (int i = 0; i < idStrings.Length; i++)
        {
            string idString = idStrings[i];

            //trying to convert one substring to int
            int id;
            if (!int.TryParse(idString, out id))
                throw new FormatException(String.Format("Query string contained malformed id '{0}'", idString));

            //writing value back to the int-array
            ids[i] = id;
        }

        return ids;
    }
}
Function GetIDs(ByVal IDList As String) As List(Of Integer)
    Dim SplitIDs() As String = IDList.Split(new Char() {","c}, StringSplitOptions.RemoveEmptyEntries)
    GetIDs = new List(Of Integer)(SplitIDs.Length)
    Dim CurID As Integer
    For Each id As String In SplitIDs
        If Integer.TryParse(id, CurID) Then GetIDs.Add(CurID)
    Next id
End Function
class Program
{
    //Accepts one or more groups of one or more digits, separated by commas.
    private static readonly Regex CSStringPattern = new Regex(@"^(\d+,?)*\d+$");

    //A single ID inside the string. Must only be used after validation
    private static readonly Regex SingleIdPattern = new Regex(@"\d+");

    static void Main(string[] args)
    {
        string queryString = "1234,4321,6789";

        int[] ids = ConvertCommaSeparatedStringToIntArray(queryString);
    }

    private static int[] ConvertCommaSeparatedStringToIntArray(string csString)
    {
        if (!CSStringPattern.IsMatch(csString))
            throw new FormatException(string.Format("Invalid comma separated string '{0}'",
                                                    csString));

        List<int> ids = new List<int>();
        foreach (Match match in SingleIdPattern.Matches(csString))
        {
            ids.Add(int.Parse(match.Value)); //No need to TryParse since string has been validated
        }
        return ids.ToArray();
    }
}