[英]Group List<Object> with keys and distinct values count
我正在嘗試提出一個解決方案來對給定的鍵和值列表進行分組。
我需要像這樣對它進行分組:Key > Dicttinct Value > Count。
例如
XFN99 2 3 <= [CODE] [DISTINCT_VALUE] [OCCURANCE IN LIST]
我有一個返回List<ObjectPart>
的方法。 此 object 具有public string code
和public int value
。
我需要獲取鍵中每個不同值的計數。
示例輸入:
XFN999 2
XFN999 2
XFN999 2
XFN999 4
XFN999 8
XFN999 8
XFN999 8
BPN655 1
BPN675 2
BPN655 1
所需的 Output:
XFN999 2 => 3x
XFN999 4 => 1x
XFN999 8 => 3x
BPN655 1 => 2x
BPN675 2 => 1x
我試圖 LINQ 以我的方式成功但失敗了,因為它對每個鍵的值求和。
var distValsPerKey = S.getAllDiffs().Result.GroupBy(x => x.code)
.Select(x => new { C_ = x.Key, V_ = x.Distinct().Count() });
Output 與我的解決方案:
BPN373 => 30
BPN374 => 35
BPN377 => 47
BPN378 => 43
BPN387 => 67
BPN388 => 49
BPN653 => 10
BPN654 => 15
BPN699 => 40
BPN700 => 45
BPN711 => 68
BPN723 => 13
BPN724 => 11
BPN853 => 5
BPN854 => 6
BPN877 => 99
BPN878 => 94
BPN505 => 92
BPN507 => 570
BPN508 => 617
我的解決方案基本上對 key 的值求和,但我需要對每個 key 的不同值求和/計數。
下面的例子:
Getting input of List<ObjectPart>
public async Task<List<ObjectPart>> getAllDiffs()
{
List<ObjectPart> TEMP = new List<ObjectPart>();
await Task.Run(() =>
{
using (IngresConnection CONN = new IngresConnection())
{
string QUERRY = SELECT_REDACTED;
try
{
using (IngresCommand CMD = new IngresCommand())
{
CONN.ConnectionString = "host=; userID=; pwd=; database=;";
CMD.Connection = CONN;
CMD.CommandText = QUERRY;
CONN.Open();
using (IngresDataReader READ = CMD.ExecuteReader())
{
while (READ.Read())
{
ObjectPart OP = new ObjectPart();
OP.wenr = READ.GetValue(0).ToString().Trim();
OP.difference = Convert.ToInt32(READ.GetInt32(1));
TEMP.Add(OP);
}
READ.Close();
CONN.Close();
}
}
}
catch (Exception E)
{
CONN.Close();
CONN.Dispose();
}
}
});
List<ObjectPart> OPS_SORTED = TEMP.OrderBy(m => m.code).ToList();
return OPS_SORTED;
}'
LINQ the input to get desired output
var distValsPerKey = S.getAllDiffs().Result.GroupBy(x => x.code).Select(x => new { C_ = x.Key, V_ = x.Distinct().Count() });
foreach(var OP in distValsPerKey)
{
Console.WriteLine($"{OP.C_} = > {OP.V_}");
}
給定以下輸入:
List<(string code, int value)> input = new()
{
("XFN999", 2),
("XFN999", 2),
("XFN999", 2),
("XFN999", 4),
("XFN999", 8),
("XFN999", 8),
("XFN999", 8),
("BPN655", 1),
("BPN675", 2),
("BPN655", 1),
};
您可以獲得所需的 output 數據,如下所示:
List<(string code, int value, int occurrences)> output =
input
.GroupBy(x => new { x.code, x.value })
.Select(x => (x.Key.code, x.Key.value, x.Count()))
.ToList();
要以您所追求的方式顯示它,請執行以下操作:
foreach (var o in output)
Console.WriteLine($"{o.code} {o.value} => {o.occurrences}");
這給了我:
XFN999 2 => 3
XFN999 4 => 1
XFN999 8 => 3
BPN655 1 => 2
BPN675 2 => 1
您想按代碼和值分組,對嗎? 所以在你的 GroupBy 中這樣做:
var distValsPerKey = S.getAllDiffs().Result
.GroupBy(x => new { x.code, x.value })
.Select(x => new { C_ = x.Key, V_ = x.Distinct().Count() });
您的代碼的 rest 應該按原樣工作,盡管如果您 output 是 GroupBy object 的密鑰,則它不會完全符合您想要的格式。 我得到如下結果:
{ code = XFN999, value = 2 } => 3
{ code = XFN999, value = 4 } => 1
{ code = XFN999, value = 8 } => 3
{ code = BPN655, value = 1 } => 2
{ code = BPN675, value = 2 } => 1
如果這不是您想要的,並且您希望 C_ 成為示例 output 中的文本字符串,則更改 Select:
var distValsPerKey = S.getAllDiffs().Result
.GroupBy(x => new { x.code, x.value })
.Select(x => new { C_ = $"{x.Key.code} {x.Key.value}",
V_ = x.Distinct().Count() });
這給出了 output:
XFN999 2 => 3
XFN999 4 => 1
XFN999 8 => 3
BPN655 1 => 2
BPN675 2 => 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.