簡體   English   中英

組列表<object>帶有鍵和不同值的計數<div id="text_translate"><p>我正在嘗試提出一個解決方案來對給定的鍵和值列表進行分組。</p><p> 我需要像這樣對它進行分組:Key &gt; Dicttinct Value &gt; Count。</p><p> 例如</p><pre>XFN99 2 3 &lt;= [CODE] [DISTINCT_VALUE] [OCCURANCE IN LIST]</pre><p> 我有一個返回List&lt;ObjectPart&gt;的方法。 此 object 具有public string code和public int value 。</p><p> 我需要獲取鍵中每個不同值的計數。</p><p> 示例輸入:</p><pre> XFN999 2 XFN999 2 XFN999 2 XFN999 4 XFN999 8 XFN999 8 XFN999 8 BPN655 1 BPN675 2 BPN655 1</pre><p> 所需的 Output:</p><pre> XFN999 2 =&gt; 3x XFN999 4 =&gt; 1x XFN999 8 =&gt; 3x BPN655 1 =&gt; 2x BPN675 2 =&gt; 1x</pre><p> 我試圖 LINQ 以我的方式成功但失敗了,因為它對每個鍵的值求和。</p><pre> var distValsPerKey = S.getAllDiffs().Result.GroupBy(x =&gt; x.code).Select(x =&gt; new { C_ = x.Key, V_ = x.Distinct().Count() });</pre><p> Output 與我的解決方案:</p><pre> BPN373 =&gt; 30 BPN374 =&gt; 35 BPN377 =&gt; 47 BPN378 =&gt; 43 BPN387 =&gt; 67 BPN388 =&gt; 49 BPN653 =&gt; 10 BPN654 =&gt; 15 BPN699 =&gt; 40 BPN700 =&gt; 45 BPN711 =&gt; 68 BPN723 =&gt; 13 BPN724 =&gt; 11 BPN853 =&gt; 5 BPN854 =&gt; 6 BPN877 =&gt; 99 BPN878 =&gt; 94 BPN505 =&gt; 92 BPN507 =&gt; 570 BPN508 =&gt; 617</pre><p> 我的解決方案基本上對 key 的值求和,但<strong>我需要對每個 key 的不同值求和/計數</strong>。</p><p> 下面的例子:</p><p> <strong>Getting input of List&lt;ObjectPart&gt;</strong></p><pre> public async Task&lt;List&lt;ObjectPart&gt;&gt; getAllDiffs() { List&lt;ObjectPart&gt; TEMP = new List&lt;ObjectPart&gt;(); await Task.Run(() =&gt; { 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&lt;ObjectPart&gt; OPS_SORTED = TEMP.OrderBy(m =&gt; m.code).ToList(); return OPS_SORTED; }'</pre><p> <strong>LINQ the input to get desired output</strong></p><pre> var distValsPerKey = S.getAllDiffs().Result.GroupBy(x =&gt; x.code).Select(x =&gt; new { C_ = x.Key, V_ = x.Distinct().Count() }); foreach(var OP in distValsPerKey) { Console.WriteLine($"{OP.C_} = &gt; {OP.V_}"); }</pre></div></object>

[英]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 codepublic 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.

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