2

カンマ区切りのテキスト ファイルを一般的なリストに変換する際に少し問題が発生しました。次の属性で定義されたクラス(「Customers」と呼ばれる)があります。

  • 名前 (文字列)
  • 都市 (文字列)
  • バランス(ダブル)
  • カード番号 (int)

値は次の形式でテキスト ファイルに保存されます: Name,City, Balance, CarNumber 例: John,Memphis,10,200789。これは複数行になります。私がやりたいことは、ユーザーがボタンをクリックしたときに各行をリスト項目に配置することです。

私は .Split() メソッドを使用して各行を分割できることを理解しましたが、正しい値をリストの正しい属性に入れる方法がわかりません。(注: get/set プロパティの使用方法は知っていますが、LINQ を使用して問題を解決することは許可されていません)。

私は学んでいるだけで、しばらくの間これに取り組んできましたが、運が悪かったので、助けていただければ幸いです。ありがとう

編集:
申し訳ありませんが、私は自分自身を明確にしていないようです. .add の使い方を知っています。テキスト ファイルに A,B,1,2 と C,D,3,4 の 2 つの行があるとします。どうすればよいかわかりませんが、リスト アイテムの位置 0 の名前「フィールド」を「等しい」にすることです。 A" であり、位置 1 の項目の名前 "field" は "C" などです。

用語の使い方が悪くて申し訳ありません。私はただ学んでいます。私が求めていることを理解していただければ幸いです(一度知ったら、それは本当に簡単だと思います)

4

3 に答える 3

3

の結果はstring.Split文字列の配列になります:

string[] lineValues = line.Split(',');

インデックスによって配列内の値にアクセスできます。

string name = lineValues[0];
string city = lineValues[1];

文字列をそれぞれのメソッドに変換しdoubleたり、それらのメソッドを使用して変換したりできます。intParse

double balance = double.Parse(lineValues[2]);
int cardNumber = int.Parse(lineValues[3]);

クラスをインスタンス化して、非常に簡単に割り当てることができます。

Customer customerForCurrentLine = new Customer()
{
    Name = name,
    City = city,
    Balance = balance,
    CardNumber = cardNumber,
};

行をループして、その行のインスタンスCustomerを作成し、作成した型の変数に追加するだけですList<Customer>

プログラムを防弾にしたい場合は、十分な値がない行や、正しい数値型に解析できない行をスキップするために、多くのチェックを行う必要があります。たとえば、 と をチェックlineValues.Length == 4して使用int.TryParse(...)double.TryParse(...)ます。

于 2012-09-15T06:13:14.583 に答える
1

ファイルを読み取り、そのテキストを改行文字に基づいて分割します。次に、合計行数について、コンマに基づいて分割し、新しいオブジェクトを作成してそのプロパティに値を挿入し、そのオブジェクトをリストに追加するループを実行します。

こちらです

List<Customers> lst = new List<Customers>();

string[] str = System.IO.File.ReadAllText(@"C:\CutomersFile.txt")
                             .Split(new string[] { Environment.NewLine }, 
                                                   StringSplitOptions.None);

for (int i = 0; i < str.Length; i++)
{
    string[] s = str[i].Split(',');

    Customers c = new Customers();

    c.Name = s[0];
    c.City = s[1];
    c.Balance = Convert.ToDouble(s[2]);
    c.CardNumber = Convert.ToInt32(s[3]);

    lst.Add(c);
}

ところでCustomer、クラス名はCustomers

于 2012-09-15T06:08:37.940 に答える
0

Split() は、ソース文字列に出現する順序で文字列の配列を生成します。したがって、名前フィールドが CSV ファイルの最初の列である場合、それは常に配列の最初のインデックスになります。

someCustomer.Name = splitResult[0];

等々。また、クラスの数値的に型指定されたプロパティについて String.TryParse を調査する必要があります。

于 2012-09-15T06:11:03.570 に答える