簡體   English   中英

從列表中獲得不同的值<Object>

[英]Get Distinct values out of List<Object>

我有一個包含Beam類實例的List 這些Beam對象中的每個都有一個Elevation屬性。

List<Beam> Beams = new List<Beam> {Beam1, Beam2, ...};

public class Beam
{
    public double Elevation;
}

現在,我想創建一個包含不同高程的List<double> 例如,如何編寫一個接受Beams列表的方法,如下所示

var Beam1 = new Beam { Elevation = 320);
var Beam2 = new Beam { Elevation = 320);
var Beam3 = new Beam { Elevation = 640);
var Beam4 = new Beam { Elevation = 0);

List<Beam> Beams = new List<Beam> {Beam1, Beam2, Beam3, Beam4};

並給出以下消除重復的高程的方法:

listOfElevations = {0, 320,640}

使用Linq-特別是Enumerable.Distinct()方法在這里很關鍵:

var listOfElevations  = beams.Select(x => x.Elevation) //project to Elevations
                             .Distinct() // pick only distinct ones
                             .ToList(); //make it a list

使用LinQ非常簡單:

var listOfElevations = Beams.Select(x => x.Elevation).Distinct().ToList();

您正在選擇“高程”的值,選擇“不同的”值,使其成為“列表”,因為它是您的預期輸出。

    List<Beam> Beams = new List<Beam> {Beam1, Beam2, Beam3, Beam4};
        var differentBeams = Beams.Select(b => b.Elevation).Distinct().ToList();  

使用LINQ另一種方法,如果您擁有多個屬性並且想要獲得唯一列表,則這可能會很有用

beams.GroupBy(x => x.Elevation).Select(g => g.Key);

1)使Beam工具IComparable:

public class Beam : IComparable
{
    public double Elevation; //consider changing this to property, btw.

    public int CompareTo(object obj) {
         if (obj == null) return 1;

         Beam otherBeam = obj as Beam;
         return this.Elevation.CompareTo(otherBeam.Elevation);
    }
}

2)使用Distinct():

var listOfElevations = Beams.Distinct().Select(x=> x.Elevation).ToList();

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