Не можете неявно преобразовать тип 'string' в 'long' с другой проблемой? - PullRequest
1 голос
/ 05 января 2011

У меня есть небольшая проблема, которую я понятия не имею, как решить. Я дам код who; e из класса, чтобы вы могли видеть, что он делает:

{

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 не может неявно преобразовать тип 'string' в 'long'"

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

Спасибо

Ответы [ 5 ]

11 голосов
/ 05 января 2011

используйте long.Parse или long.TryParse.

3 голосов
/ 05 января 2011

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

Образец: dfr.TotalSingleScore = Int64.Parse(s.Split(',')[12]);

2 голосов
/ 05 января 2011

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

Int64.TryParse()

0 голосов
/ 31 июля 2011

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

    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

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

0 голосов
/ 05 января 2011

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

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

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

...