1

テキスト ファイルの内容に基づいて 3 つのリストを生成するプログラムがあります。リストを調べたいのですが、アイテムが複数回ある場合は、値を「リスト内の番号 x アイテム」に変更し、リストから重複を削除したいと考えています。

ファイルを開いてリストに分割するために使用するコードは次のとおりです。

    private void open_Click(object sender, EventArgs e)
    {
        if (inputFile.ShowDialog() == DialogResult.OK)
        {
         var reader = new StreamReader(File.OpenRead(inputFile.FileName));
         while (!reader.EndOfStream)
             {
                 string line = reader.ReadLine();
                 if (string.IsNullOrEmpty(line)) continue;
                 if (line.StartsWith("#main"))
                 {
                     deck = "main";
                 }
                 if (deck == "main")
                 {
                     if (!line.StartsWith("#"))
                     {
                         int cardid = Convert.ToInt32(line.Substring(0));
                         MainDeck.Items.Add(Program.CardData[cardid].Name);
                     }
                 }
                 if (line.StartsWith("#extra"))
                 {
                     deck = "extra";
                 }
                 if (deck == "extra")
                 {
                     if (!line.StartsWith("#extra") && !line.StartsWith("!side"))
                     {
                         int cardid = Convert.ToInt32(line.Substring(0));
                         ExtraDeck.Items.Add(Program.CardData[cardid].Name);
                     }
                 }

                 if (line.StartsWith("!side"))
                 {
                     deck = "side";
                 }
                 if (deck == "side")
                 {
                     if (!line.StartsWith("!side"))
                     {
                         int cardid = Convert.ToInt32(line.Substring(0));
                         SideDeck.Items.Add(Program.CardData[cardid].Name);
                     }
                 }
            }
         reader.Close();
         GenerateCode();
        }
    }

つまり、項目"hello"がリストに 3 回あるとします。リストに 1 回だけあるように変更して、 と言いたいとします"3x hello"

4

4 に答える 4

1

何かのようなもの:

var g = MainDeck.Items.GroupBy(i => i).Select(x => x.Count() +"x " + x.Key);

そこにある「メイン」という単語だけを数えたい場合は、それを除外できます。他のリストについても同様です。

その時点では、クエリは評価されません。.ToList()または.ToArray()を実行して、 でそれを実現しますg

于 2013-07-24T07:05:16.223 に答える
0

あなたもそれを試すことができます。

var list = new List<string> { "Hello", "World", "Hello", "Great", "World" };

var query = list.GroupBy(s => s)
        .Select(g => new { Value = g.Key, Count = g.Count() });

それで、

var resultList = query.Select(result => string.Format("{0}x {1}", result.Count, result.Value)).ToList();

または上記のコードは、より明確にするために以下のように置き換えることができます

foreach (var result in query)
    resultList.Add(string.Format("{0}x {1}", result.Count, result.Value));

それが役に立てば幸い。

于 2013-07-24T07:11:46.520 に答える