10

現在、URL パラメーターを介して単一の ID 値を受け入れる Web ページがあるとします:
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 にあるため、ラムダはありません。

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

機能的なスタイルが好きなら、次のようなものを試すことができます

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

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

ラムダはありませんが、コンバーターと述語、およびメソッドから作成できるその他の優れた機能があります。

于 2008-09-15T14:52:17.810 に答える
2

私が考えることができるのは、文字列のリスト(分割を実行して取得したもの)をループし、int.TryParse()それらを次々と実行して new に入れることだけList<int>です。どこかの素敵な小さなヘルパー メソッドにカプセル化すれば、それほど恐ろしいことにはなりません。

于 2008-09-15T14:40:53.267 に答える
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

私が望むものをとる最終的なコードスニペットは、すべての提案から最高です:

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

インラインで1行か2行のコードでそれを実行できることを望んでいました。文字列配列を作成し、うまくいけば、キャストをインテリジェントに処理できるList<int>へのインポートを処理するために私がまだ知らなかったフレームワークで何かを見つけるための1行。しかし、それをメソッドに移動する必要がある場合は、移動します。はい、VBを使用しています。質問をするのにC#が好きです。なぜなら、彼らはより多くの聴衆を獲得し、私はほぼ同じくらい流暢だからです。

于 2008-09-15T15:01:27.663 に答える
1

最初に思いつくのは split ですが、これは List ではなく配列を返します。次のようなものを試すことができます:


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

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

于 2008-09-15T14:45:29.310 に答える
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によって返された配列を繰り返し処理し、intの新しい配列に変換します。以下の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 に答える
0

URL から値を抽出したら、 string.Split() を使用して値を分割できます。

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

それらを foreach し、それぞれを int.TryParse するだけです。その後、リストに追加するだけです。

気にしないでください - @Splash は私を打ち負かしました

于 2008-09-15T14:41:46.867 に答える