1

リストを使用してかなり具体的なことを行い、一意のインスタンスを数えて、それをファイルの新しい行に保存しようとしています。

基本的に、一連の列を含むリストビューがあり、リスト全体をループして、一意の各アイテムの数を保存したいと考えています。

例、そのようなリスト;

111
222
111
333
333
333

次のようにファイルに書き込まれます。

111:2
222:1
333:3

それらの値がある限り、特定の順序である必要はありません。

これまでのところ、これがあります。

string fileName = Application.StartupPath + @"\txn_" + 
    TerminalConfig.CreateSafSig() + ".saf";

Dictionary<string, int> products = new Dictionary<string, int>();
List<string> codes = new List<string>();

foreach (ListViewItem item in BasketList.Items)
{ 
    codes.Add(item.SubItems[3].Text); 
}

String[] items = codes.ToArray();
foreach (String code in items)
{
    if (products.ContainsKey(code) != true)
    { 
        products.Add(code, 1); 
    }
    else 
    { 
        products[code] += 1; 
    }
}

foreach (var entry in products)
{ 
    File.WriteAllText(fileName, string.Format("{0}:{1}",entry.Key,entry.Value)); 
}

しかし、それが保存するファイルは、最後の行になるものだけを提供しています。上記の例では、表示されるのは333:3

私はそれを正しく書いたと確信していましたが、どこが間違っているのかを見つけるのに苦労しています。

4

4 に答える 4

4

File.WriteAllText新しいファイルを書き込みます。for ループを反復処理するたびにファイルを上書きして、最後の行だけを表示します。

msdnページが表示されます

新しいファイルを作成し、内容をファイルに書き込み、ファイルを閉じます。対象ファイルが既に存在する場合は上書きされます。

which を次File.WriteAllTextのように置き換えることができます。File.AppendAllText

ファイルを開き、指定された文字列をファイルに追加してから、ファイルを閉じます。ファイルが存在しない場合、このメソッドはファイルを作成し、指定された文字列をファイルに書き込み、ファイルを閉じます。

ファイルを一度に書きたい場合は、File.WriteAllLines(string path,IEnumerable<string> contents);を使用できます。どれの

新しいファイルを作成し、文字列のコレクションをファイルに書き込み、ファイルを閉じます。

あなたの場合、次を置き換えます:

foreach (var entry in products)
{ 
    File.WriteAllText(fileName, string.Format("{0}:{1}",entry.Key,entry.Value)); 
}

var entries = from entry in products select string.Format("{0}:{1}",entry.Key,entry.Value);
File.WriteAllLines(fileName,entries);
于 2013-10-10T20:26:03.563 に答える
2

ハリソンは、あなたのコードが機能しない理由を答えました...では、Jonesyが(無礼に)GroupByの使用を提案した理由をお見せしましょう...

File.WriteAllLines(fileName,
               from item in BasketList.Items
               group item by item.SubItems[3].Text into grp
               select string.Format("{0}:{1}", grp.Key, grp.Count()));

これにより、すべてのコードが効果的に置き換えられます。これあまり効率的ではありません --GroupBy実際にはカウントのみが必要な場合に項目のグループを作成するため、メモリ使用量が少し重くなります -- しかし、それは多くの場合、非常に重要な要素ではありません。簡潔であることについては、言うべきことがあります。

于 2013-10-10T20:35:50.127 に答える
0

WriteAllText 関数は、指定した文字列でファイルの内容を上書きします。代わりに AppendAllText 関数を使用する必要があります

于 2013-10-10T20:27:25.383 に答える