簡體   English   中英

將列表分組並僅在輸入為列表時獲取不同的值

[英]group a list and only get distinct values when input is a list

我需要以下方面的幫助:

我有一個列表,需要從中刪除所有重復條目,但我似乎無法獲得正確的 linq 查詢。 現在列表本身包含一個字符串和一個字符串列表作為參數。

查看代碼片段:

該列表是從此類創建的

public class SD
{
    public string From { get; set; }
    public List<string> To { get; set; }
}

列表的輸入可能如下所示:

var unsortedList = new List<SD>
{
    new SD {From = "a", To = new List<string>{ "b" } },
    new SD {From = "b", To = new List<string>{ "a" } },
    new SD {From = "a", To = new List<string>{ "b", "c" } },
    new SD {From = "a", To = new List<string>{ "b" } },
    new SD {From = "a", To = new List<string>{ "c" } },
};

在類中的 To 是一個列表並且只是一個字符串之前,下面的代碼運行良好。 它將返回 4 個條目,因為條目 1 和 4 相等(當然,第 3 個條目只有一個字符串)。

var sortedList = unsortedList.GroupBy(x => new { x.From, x.To }).Select(group => group.First()).ToList();

我一直在玩 orderby、group 和 hashsets,但似乎都不起作用。

您可以將To列表加入字符串並將其用作GroupBy方法中的鍵選擇器的一部分。 然后選擇每組中的第一項以獲取沒有重復項的SD項列表

var sortedList = unsortedList.GroupBy(x => new {x.From, To = string.Join(",", x.To)})
    .Select(g => g.First())
    .ToList();

foreach (var item in sortedList) 
    Console.WriteLine($"{item.From} {string.Join(",", item.To)}");

它將產生以下輸出

a b
b a
a b,c
a c

您可以在此處創建自定義IEqualityComparer<T>

public class MyComparer : IEqualityComparer<SD>
{
    public bool Equals(SD x, SD y)
    {
        return x.From == y.From && x.To.SequenceEqual(y.To);
    }

    public int GetHashCode(SD obj)
    {
        return obj.From.GetHashCode();
    }
}

然后將此比較器應用於Distinct()以刪除重復項:

var noDuplicates = unsortedList.Distinct(new MyComparer());

foreach (var item in noDuplicates)
{
    Console.WriteLine($"From={item.From} To={string.Join(", ", item.To)}");
}

// From=a To=b
// From=b To=a
// From=a To=b, c
// From=a To=c

組列表<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

暫無
暫無

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

相關問題 獲取不同的列表值 獲取列表中列表的不同值 獲取 List 中不同值的列表 從列表中獲取不同的值 組列表<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> 按不同的整數列表分組 從嵌套對象中獲取不同的值列表 從List獲取不同的屬性值 Linq查詢以獲取列表中的不同值 LINQ獲取不同的值並填寫LIST
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM