10

假设我有一个网页当前通过 url 参数接受单个 ID 值:
http ://example.com/mypage.aspx?ID=1234

我想将其更改为接受id列表,如下所示:
http ://example.com/mypage.aspx?IDs=1234,4321,6789

所以它可以通过context.Request.QueryString["IDs"]作为字符串提供给我的代码。 将该字符串值转换为 List<int> 的最佳方法是什么?

编辑:我知道如何在逗号上执行 .split() 以获取字符串列表,但我问是因为我不知道如何轻松将该字符串列表转换为 int 列表。这仍然在 .Net 2.0 中,所以没有 lambdas。

4

13 回答 13

13

没有冒犯那些提供明确答案的人,但许多人似乎在回答你的问题而不是解决你的问题。你想要多个 ID,所以你认为你可以这样:

http://example.com/mypage.aspx?IDs=1234,4321,6789

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

http://example.com/mypage.aspx?ID=1234;ID=4321;ID=6789

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

于 2008-09-15T14:57:42.587 回答
12

像这样的东西可能会起作用:

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

然后将使用它:

string intString = "1234,4321,6789";

IList<int> list = GetIdListFromString(intString);

foreach (int i in list)
{
    Console.WriteLine(i);
}
于 2008-09-15T14:47:43.470 回答
4

您可以从数组中实例化 List<T>。

VB.NET:

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

如果数组包含非 int 元素,这很容易出现转换错误

于 2008-09-15T14:42:48.597 回答
2

我能想到的就是循环遍历字符串列表(您从执行拆分中获得)并int.TryParse()一个接一个地对它们执行类似操作并将它们放入一个新的List<int>. 将它封装在某个地方的一个不错的小助手方法中,它不会太可怕。

于 2008-09-15T14:40:53.267 回答
2

如果你喜欢功能风格,你可以尝试类似

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

    List<int> l = new List<int>(Array.ConvertAll(
        ids.Split(','), new Converter<string, int>(int.Parse)));

没有 lambda,但你确实有转换器和谓词以及其他可以由方法制成的好东西。

于 2008-09-15T14:52:17.810 回答
2

我看到我的答案来得太晚了,即其他几个人也写了同样的。因此,我提出了一种使用正则表达式来验证和划分字符串的替代方法。

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();
    }
}
于 2008-09-15T15:16:28.017 回答
1

split 是首先想到的,但它返回一个数组,而不是一个列表;你可以尝试类似的东西:


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

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

于 2008-09-15T14:45:29.310 回答
1

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

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

我希望能够在一两行内联代码中做到这一点。一行来创建字符串数组,并希望在框架中找到一些我还不知道的东西来处理将它导入到可以智能地处理强制转换的 List<int> 。但是,如果我必须将其移至方法,那么我会的。是的,我正在使用 VB。我只是更喜欢 C# 来提问,因为它们会吸引更多的听众,而且我的流利程度也差不多。

于 2008-09-15T15:01:27.663 回答
0

从 URL 中提取值后,您可以使用 string.Split() 来拆分它们。

string[] splitIds = ids.split(',');
于 2008-09-15T14:37:17.673 回答
0

您只需要遍历它们并 int.TryParse 中的每一个。之后只需添加到列表中。

没关系 - @Splash 打败了我

于 2008-09-15T14:41:46.867 回答
0
List<int> convertIDs = new List<int>;
string[] splitIds = ids.split(',');
foreach(string s in splitIds)
{
    convertIDs.Add(int.Parse(s));
}

为了完整起见,您需要在 for 循环周围(或在 int.Parse() 调用周围)放置 try/catch,并根据您的要求处理错误。您也可以像这样执行 tryparse():

List<int> convertIDs = new List<int>;
string[] splitIds = ids.split(',');
foreach(string s in splitIds)
{
    int i;
    int.TryParse(out i);
    if (i != 0)
       convertIDs.Add(i);
}
于 2008-09-15T14:50:09.500 回答
0

要继续上一个答案,只需遍历 Split 返回的数组并转换为新的整数数组。下面的 C# 示例:

        string[] splitIds = stringIds.Split(',');

        int[] ids = new int[splitIds.Length];
        for (int i = 0; i < ids.Length; i++) {
            ids[i] = Int32.Parse(splitIds[i]);
        }
于 2008-09-15T14:50:45.647 回答
0

我认为最简单的方法是如前所示进行拆分,然后循环遍历这些值并尝试转换为 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;
    }
}
于 2008-09-15T14:57:16.440 回答