Разделение ints от строки

Следующие работали для меня. Просто добавьте следующий фрагмент:

android {
        compileSdkVersion 25
        buildToolsVersion '25.0.1'

defaultConfig {
        applicationId "yourpackage"
        minSdkVersion 10
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
dexOptions {
        javaMaxHeapSize "4g"
    }
}
10
задан Joel Coehoorn 7 July 2011 в 00:33
поделиться

13 ответов

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

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

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

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

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

13
ответ дан 3 December 2019 в 14: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);
}
11
ответ дан 3 December 2019 в 14:12
поделиться

Можно инстанцировать Списка <T> от массива.

VB.NET:

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

Это подвержено кастингу ошибок хотя, если массив содержит немеждународные элементы

4
ответ дан 3 December 2019 в 14:12
поделиться

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

2
ответ дан 3 December 2019 в 14:12
поделиться

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

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

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

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

2
ответ дан 3 December 2019 в 14:12
поделиться

Я вижу, что мой ответ появился довольно поздно, т.е. несколько другой записал то же. Поэтому я представляю альтернативную методику с помощью регулярных выражений, чтобы проверить и разделить строку.

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();
    }
}
2
ответ дан 3 December 2019 в 14:12
поделиться

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


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

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

1
ответ дан 3 December 2019 в 14:12
поделиться

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

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# для того, чтобы задать вопросы, потому что они получат более многочисленную аудиторию, и я примерно как быстрый.

1
ответ дан 3 December 2019 в 14:12
поделиться

Можно использовать строку. Разделение () для разделения значений, после того как Вы извлекли их из URL.

string[] splitIds = ids.split(',');
0
ответ дан 3 December 2019 в 14:12
поделиться

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

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

0
ответ дан 3 December 2019 в 14:12
поделиться
List<int> convertIDs = new List<int>;
string[] splitIds = ids.split(',');
foreach(string s in splitIds)
{
    convertIDs.Add(int.Parse(s));
}

Для полноты Вы захотите поместить попытку/выгоды вокруг для цикла (или вокруг международного Синтаксического анализа () вызов) и обработать ошибку на основе Ваших требований. Можно также сделать 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);
}
0
ответ дан 3 December 2019 в 14:12
поделиться

Продолжать предыдущий ответ, вполне просто выполняющий итерации через массив, возвращенный Разделением и преобразовывающий в новый массив ints. Этот образец ниже в 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]);
        }
0
ответ дан 3 December 2019 в 14:12
поделиться

Я думаю, что самый легкий путь состоит в том, чтобы разделить как показано прежде, и затем цикл через значения и попытаться преобразовать в интервал.

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;
    }
}
0
ответ дан 3 December 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: