Как эффективно разделить строку, добавить ее в список и преобразовать в двойную? - PullRequest
0 голосов
/ 24 мая 2018

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

Код читается следующим образом:

List<string> positions = new List<string>();
List<string> players = new List<string>();

foreach (string element in fractionedList)
{
   positions.Add(element.Split(',')[2]); 
   positions.Add(element.Split(',')[3]); 
   positions.Add(element.Split(',')[4]); 

   players.Add(element.Split(',')[5]); 
   players.Add(element.Split(',')[6]); 
   players.Add(element.Split(',')[7]);
} 

List<double> convertedPositions = positions.Select(x => double.Parse(x)).ToList();
List<double> convertedPlayers = playerss.Select(x => double.Parse(x)).ToList();

Для справки, мой FractionList будет выглядеть примерно так:

"string0,string1,string2,string3,string4,string5,string6,string7,string8,string9,string10,string11,string12",
"string0,string1,string2,string3,string4,string5,string6,string7,string8,string9,string10,string11,string12",
"string0,string1,string2,string3,string4,string5,string6,string7,string8,string9,string10,string11,string12",
"string0,string1,string2,string3,string4,string5,string6,string7,string8,string9,string10,string11,string12",

Таким образом, я пытаюсь разделить каждый экземпляр строки списка, получить следующие три элемента, а затем добавить их в новый список и затем преобразовать этот список в новый список двойников.Мне интересно, есть ли более чистый способ обработки метода Сплита.Есть ли эквивалент Take ()?Кроме того, можно ли все это сделать за один раз, создав список, а не создав список строк, создав список двойников?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Это будет выполнять преобразование в строке, без необходимости сохранять в начальном списке строк

List<double> convertedPositions = new List<double>();
List<double> convertedPlayers = new List<double>();

foreach (string element in fractionedList)
{
    var elements = element.Split(',');

    convertedPositions.AddRange(elements.Skip(2).Take(3).Select(x=> Convert.ToDouble(x)));
    convertedPositions.AddRange(elements.Skip(5).Take(3).Select(x => Convert.ToDouble(x));
}
0 голосов
/ 24 мая 2018

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

С помощью небольшого LINQ вы можете сократить свой код:

List<double> positions = new List<double>();
List<double> players = new List<double>();

foreach (string element in fractionedList)
{
    string[] elementSplit = element.Split(',');
    positions.AddRange(elementSplit.Skip(2).Take(3).Select(x => double.Parse(x));
    players.AddRange(elementSplit.Skip(5).Take(3).Select(x => double.Parse(x)); 
} 

Мой код разбивает вашу переменную element на , как вы делали (сейчас только один раз).Затем, используя Take() и Skip() у Линка, я выбираю индексы [2,3,4] и [5,6,7] и добавляю их в соответствующие списки (после анализа на удвоение).

Имейте в виду, что этот код будетисключение, если ваш строковый ввод является чем-то, что не может разумно разобрать в double.Если вы уверены, что входные данные всегда будут хорошими, тогда этот код должен помочь вам быстрее всех.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...