2008-09-15 2 views
10

Скажем, у меня есть веб-страницу, которая в настоящее время принимает одно значение ID с помощью параметра URL:
http://example.com/mypage.aspx?ID=1234отщепляются Интс из строки

Я хочу, чтобы изменить его, чтобы принять список идентификаторов, как это :
http://example.com/mypage.aspx?IDs=1234,4321,6789

Так он доступен для моего кода в виде строки через context.Request.QueryString [ "ИД"]. Каков наилучший способ превратить это строковое значение в список < int>?

Редактировать: Я знаю, как сделать .split() в запятой, чтобы получить список строк, но я спрашиваю, потому что я не знаю, как легко преобразовать этот список строк в список int. Это все еще в .Net 2.0, поэтому нет лямбдов.

ответ

13

Не обижайтесь на тех, кто предоставил четкие ответы, но многие люди, кажется, отвечают на ваш вопрос, вместо того чтобы решать вашу проблему. Вы хотите несколько идентификаторов, так что вы думаете, вы могли бы это так:

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

Проблема заключается в том, что это не является надежным решением. В будущем, если вы хотите несколько значений, что вы будете делать, если у них есть запятые? Лучшее решение (и это вполне допустимо в строке запроса), заключается в использовании нескольких параметров с таким же именем:

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

Затем, независимо от строки запроса парсер вы используете должны быть в состоянии вернуть список идентификаторы. Если он не может справиться с этим (а также обрабатывать полуколоны вместо амперсандов), то он сломан.

+1

У asp.net нет проблем с page.aspx? Id = 1,2,3,4 & otherid = 4,5,6,7, поэтому я не вижу почему список, разделенный запятыми, является ненадежным решением. – 2008-10-13 22:15:01

0

Вы можете использовать string.Split(), чтобы разделить значения после их извлечения из URL-адреса.

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

Все, что я могу думать о том, чтобы петли над списком строк (которые вы получили от выполнения раскола) и делать что-то вроде int.TryParse() на них один за другим и положить их в новый List<int>. Инкапсулируйте его в приятный помощник, и он не будет слишком ужасным.

0

Вам просто нужно пропустить через них и int.TryParse каждого из них. после этого просто добавьте в список.

Nevermind - @Splash бить меня к нему

4

Вы можете создать экземпляр списка <T> из массива.

VB.NET:

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

Это подвержено ошибкам литья, хотя, если массив содержит не-ИНТ элементы

+0

Проблема в том, что только одна ошибка кастинга убивает весь список, но я все еще проголосовал за это, и, возможно, это поведение, в котором я должен идти. – 2008-09-15 14:50:21

1

раскола это первое, что приходит на ум, но это возвращает массив, не Список; вы могли бы попробовать что-то вроде:


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

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

11

Что-то подобное может работать:

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); 
} 
+0

Ничего, я как раз собирался опубликовать тот же ответ :( – Huppie 2008-09-15 14:54:37

0
List<int> convertIDs = new List<int>; 
string[] splitIds = ids.split(','); 
foreach(string s in splitIds) 
{ 
    convertIDs.Add(int.Parse(s)); 
} 

Для полноты Вы хотите поместить try/ловит вокруг цикла for (или вокруг вызова int.Parse()) и обрабатывать ошибку на основе вашего requir ements. Вы можете также сделать TryParse() следующим образом:

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]); 
     } 
2

Если вам нравится функциональный стиль, вы можете попробовать что-то вроде

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

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

Нет лямбды, но у вас есть конвертеры и Предикаты и другие приятные вещи, которые могут быть сделаны из методов.

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

Я надеялся, чтобы быть в состоянии сделать это в одном или двух строк кода инлайн. Одна строка для создания массива строк и, надеюсь, найдет что-то в рамках, которые я еще не знал, чтобы обработать импорт его в список < int>, который мог бы обрабатывать бросок разумно. Но если я должен переместить его на метод, тогда я это сделаю. И да, я использую VB. Я просто предпочитаю C# задавать вопросы, потому что они получат более широкую аудиторию, и я почти уверен.

2

Я вижу my answer пришел довольно поздно, т. Е. Несколько других писали то же самое. Поэтому я представляю альтернативный метод, используя регулярные выражения для проверки и деления строки.

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(); 
    } 
} 
Смежные вопросы