2011-01-05 2 views
1

У меня есть небольшая проблема, о которой я понятия не имею, как ее решить. Я дам, которые, электронный код из класса, так что вы можете увидеть, что его делание:Невозможно неявно преобразовать тип 'string' в 'long' с другой проблемой?

{

class CompetitorDataFile 
{ 
    //collection of DataFileRecords - people 
    public List<DataFileRecord> DataFileRecords; 
    public string FileName = ""; 

    //called when DataFile created 
    public CompetitorDataFile(string FileName) 
    { 
     //creates the collection 
     DataFileRecords = new List<DataFileRecord>(); 
     this.FileName = FileName; 
    } 

    //fill DataFileRecords with stuff from text file 
    public void ReadDataFile() 
    { 
     foreach (string s in File.ReadAllLines(FileName)) 
     { 
      if (s == "") continue; 
      DataFileRecord dfr = new DataFileRecord(); 
      dfr.Name = s.Split(',')[0]; 
      dfr.CPSA = s.Split(',')[1]; 
      dfr.PostCode = s.Split(',')[2]; 
      dfr.Rank = s.Split(',')[3]; 
      dfr.Score1 = s.Split(',')[4]; //new for score system 
      dfr.Score2 = s.Split(',')[5]; //new for score system 
      dfr.Score3 = s.Split(',')[6]; //new for score system 
      dfr.Score4 = s.Split(',')[7]; //new for score system 
      dfr.Score5 = s.Split(',')[8]; //new for score system 
      dfr.Score6 = s.Split(',')[9]; //new for score system 
      dfr.Score7 = s.Split(',')[10]; //new for score system 
      dfr.Score8 = s.Split(',')[11]; //new for score system 
      dfr.TotalSingleScore = s.Split(',')[12]; //new for score system 
      DataFileRecords.Add(dfr); 
     } 
    } 

    public int FindByCPSA(string CPSA) 
    { 
     //set index to 0 
     int index = 0; 
     //go through each record looking for CPSA number match 
     foreach (DataFileRecord dfr in DataFileRecords) 
     { 
      if (dfr.CPSA.ToLower() == CPSA.ToLower()) 
      { 
       //if it's found return the current index 
       return index; 
      } 
      //increase index and move to next record 
      index++; 
     } 
     //not found returning -1 
     return -1; 
    } 

    //save DataFile records to text file 
    public void SaveDataFile() 
    { 
     //delete backup file if found 
     if (File.Exists(FileName+".bck")) 
      File.Delete(FileName+".bck"); 
     //make backup of existing 
     if (File.Exists(FileName)) 
      File.Move(FileName, FileName + ".bck"); 
     //create a temporary array of string 
     List<string> stringy = new List<string>(DataFileRecords.Count); 
     //go through each DataFile record and create a single string line 
     foreach (DataFileRecord dfr in DataFileRecords) 
      stringy.Add(dfr.SingleString); 
     //saves all strings to file 
     File.WriteAllLines(FileName, stringy.ToArray()); 
    } 
} 

//a single record - one person 
public class DataFileRecord 
{ 
    public string Name; 
    public string CPSA; 
    public string PostCode; 
    public string Rank; 
    public string Score1; //new for score system 
    public string Score2; //new for score system 
    public string Score3; //new for score system 
    public string Score4; //new for score system 
    public string Score5; //new for score system 
    public string Score6; //new for score system 
    public string Score7; //new for score system 
    public string Score8; //new for score system 
    public Int64 TotalSingleScore; // used to get total score for one user 

    public string SingleString 
    { 
     get 
     { 
      return string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11}", Name, CPSA, PostCode, Rank, Score1, Score2, Score3, Score4, Score5, Score6, Score7, Score8); //,{4} and , Score are new for score system 
     } 
    } 

    public string PoshSingleString 
    { 
     get 
     { 
      return string.Format("{0,-20}|{1,-10}|{2,-9}|{3,-9}|{4,2}|{5,2}|{6,2}|{7,2}|{8,2}|{9,2}|{10,2}|{11,2}", Name, CPSA, PostCode, Rank, Score1, Score2, Score3, Score4, Score5, Score6, Score7, Score8); 
      //return SingleString.Replace(",0", ""); //may be used to replace 0 
      //return SingleString.Replace(",", ", "); 
     } 

У меня есть проблема с этой строки кода

dfr.TotalSingleScore = s.Split(',')[12]; 

TotalSingleScore является только int (все остальные строки), в результате я получаю эту ошибку: «Ошибка 1 Невозможно неявно преобразовать тип« строка »в« длинный »

Как мне решить это? Кодекс C# и программное обеспечение VS 2008 Pro

Благодаря

ответ

3

Поскольку TotalSingleScore объявлен как Int64, вы должны использовать Int64.Parse.

Пример: dfr.TotalSingleScore = Int64.Parse(s.Split(',')[12]);

10

использование long.Parse или long.TryParse.

+1

Это даст другой результат, независимо от того, работает ли он на 32-разрядной и 64-разрядной машине. Он явно использует Int64, в котором Int64.parse возвращает long. int.Parse()! = long.Parse() –

+0

конечно. Я только читаю int в его описании. – Femaref

+0

@ Андрей, ты ошибаешься. 'int' - 32-разрядный, независимо от того, находитесь ли вы на 32-битной или 64-битной машине, поэтому результаты будут одинаковыми. – svick

2

dfr.TotalSingleScore = Int64.Parse(s.Split(',')[12]);

Int64.TryParse()

+0

Int63;) ............. –

0

Возьмите строку и преобразовать ее. Как и другие, методы TryParse или Parse отлично работают, если данные не могут быть типом литья. Но вы также можете сделать это, используя System.Convert.

dfr.TotalSingleScore = Convert.ToInt64(s.Split(',')[12]); 

http://msdn.microsoft.com/en-us/library/system.convert.toint64.aspx

+0

Convert.ToInt64 (строка) внутренне вызывает Int64.Parse (string). Однако, если вы используете Int64.Parse (или эквивалентный int.Parse), вы можете указать глобализацию и форматирование, используемые при разборе. – HABJAN

+0

Правда, однако Int64.Parse принимает только строку и Convert.ToInt64 обертывает Type.Parse, чтобы принимать другие типы. Но я предпочитаю Parse или TryParse moreso, просто говоря о другом. –

0

Просто любопытно, почему вы Расщепление строка каждый раз? Не было бы лучше, если бы вы просто разделили его один раз и повторно использовали массив?

var myArray = s.split(','); 
    dfr.Name = myArray[0]; 
    dfr.CPSA = myArray[1]; 
    dfr.PostCode = myArray[2]; 
    dfr.Rank = myArray[3]; 
    dfr.Score1 = myArray[4]; //new for score system 
    dfr.Score2 = myArray[5]; //new for score system 
    dfr.Score3 = myArray[6]; //new for score system 
    dfr.Score4 = myArray[7]; //new for score system 
    dfr.Score5 = myArray[8]; //new for score system 
    dfr.Score6 = myArray[9]; //new for score system 
    dfr.Score7 = myArray[10]; //new for score system 
    dfr.Score8 = myArray[11]; //new for score system 
    : 
    etc 

Не ответ на ваш вопрос, но я думал, что должен был предложить это.

Смежные вопросы