簡體   English   中英

如何從字符串中計算數字

[英]how can I count a number from a string

string val = "4 12 441 662 2234 441 441";       

在刪除重復項后,我正在嘗試計算重復項。 目前我被卡住了,無法前進。

我想要這個輸出4 12 662 2234 3x 441

你可以像這樣用 Linq 做到這一點:

string val = "4 12 441 662 2234 441 441";

var groupedValues = 
    val.Split(' ')
   .GroupBy(x => x)
   .OrderBy(g => g.Count())
   .Select(g => g.Count() > 1 ? g.Count() + "x " + g.Key : g.Key);

var result = string.Join(' ', groupedValues);

Console.WriteLine(result); // 4 12 662 2234 3x 441 

如下編寫 Linq 會稍微更有效,以避免重新計算Count()兩次:

var groupedValues = 
    val.Split(' ')
   .GroupBy(x => x)
   .Select(f => (count: f.Count(), value: f.Key))
   .OrderBy(g => g.count)
   .Select(h => h.count > 1 ? h.count + "x " + h.value : h.value);

請注意.OrderBy() ,它確保根據您的原始要求將重復值放在輸出的末尾。

為什么要使用正則表達式?

string val = "4 12 441 662 2234 441 441";
Console.WriteLine(string.Join(" ", val.Split(' ').GroupBy(x => x).Select(x => x.Count() > 1 ? $"{x.Count()}x {x.Key}" : x.Key)));

您可以在字符串中創建一個數字數組,方法是使用空格分隔符將它們分開,然后更容易找出數組中的重復項。

您可以使用 linq。

  1. 將字符串分成幾部分。
  2. 使用GroupBy表達式將所有相同的內容分組。 (分組有一個Key和一個包含所有匹配項的List
  3. 聚合這需要一個起始字符串和一個表達式如何處理正在進行的元素
string val = "4 12 441 662 2234 441 441";
                
var splitted = val.Split(' ');

var resultString = splitted.ToList()
   .GroupBy(el => el)
   .Select(grouping => grouping.Count() + "x " + grouping.Key)
   .Aggregate("", (s1, s2) => s1 + s2 + ", ");

   Console.WriteLine(resultString);

使用LINQ

string val = "4 12 441 662 2234 441 441";
var result = val.Split(" ")
                .GroupBy(x => x)
                .ToDictionary(y => y.Key, y => y.Count())
                .OrderBy(z => z.Value)
                .Select(x=> x.Value == 1 ? $"{x.Key}" : $"{x.Value}x {x.Key}")
                .ToList();

Console.WriteLine(string.Join(" ", result));

輸出

4 12 662 2234 3x 441

我認為這可以工作:

首先將您的string作為List

string val = "4 12 441 662 2234 441 441";
var list = val.Split(' ').ToList();

然后獲取重復的值並存儲到具有ValueCount的對象中:

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

現在你有類似[{Value: X, Count: X}, {...}, {...} ... ]

然后迭代這個列表,你可以創建一個新的string來輸出

var str = "";
foreach (var item in query)
{
  if(item.Count > 1)
  {
    str += item.Count+"x ";
  }
  str+=item.Value+" ";
}
Console.WriteLine("str = "+str);

輸出為: str = 4 12 3x 441 662 2234

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM