簡體   English   中英

將列表中的離散值分離到不同的列表對象C#中

[英]seperate distict values from a list into different list object c#

我有一個列表對象,其中有100個數字。 我想針對所有唯一數字分隔所有列表對象。

這是我的清單對象

public class USERDETAILS
{
     private long _ID;
     public long ID
     {
         get { return _ID; }
         set { _ID = value; }
     }

     private long _MSISDN;
     public long MSISDN
     {
         get { return _MSISDN; }
         set { _MSISDN = value; }
     }
}

List<USERDETAILS> lstUSERDETAILS = new List<USERDETAILS>();

我的清單上有10個號碼

ID  MSISDN
101 9000001
102 9000002
103 9000002
104 9000003
105 9000003
106 9000003
107 9000007
108 9000008
109 9000009
110 9000010

我想在不同的列表對象中獲得重復的條目。 這是預期的輸出:

第一個列表對象:

ID  MSISDN
101 9000001
102 9000002
104 9000003
107 9000007
108 9000008
109 9000009
110 9000010

第二個列表對象:

ID  MSISDN
103 9000002
105 9000003

第三個清單物件:

ID  MSISDN
106 9000003

我曾嘗試過linq group by;

var listOfUnique_USERDETAILS_Lists = listUSERDETAILS.GroupBy(p => p.MSISDN).Select(g => g.ToList());

我也嘗試過遍歷for循環以獲取不同的數字,然后將其放在list<USERDETAILS>對象中,然后在新的重復條目列表中創建它,但希望以更簡化的方式進行操作。

干得好。

如果運行此命令:

List<UserDetails> source = new List<UserDetails>();

UserDetails[][] grouping = source
                         .GroupBy( x=> x.MSISDN )
                         .Select( y => y.OrderBy( z => z.ID ).ToArray() )
                         .ToArray()
                         ;

給你一個UserDetails[]數組。

grouping[n]為您提供共享相同MSISDN值的所有UserDetails對象的數組,按其ID屬性排序。

grouping[n][0]將為您提供該MSISDN的第一個此類對象。 遍歷該對象將為您提供“獨特”的“第一個”對象集。 由於保證每個分組至少有一個這樣的項目,我們可以簡單地說:

UserDetails[] firstList = grouping.Select( x => x.First() ).ToArray() ;

您可以通過以下方式獲取第二,第三,第四等列表:

        int n = 2 ; // specify a suitable value for n such that n > 0 (1:1st, 2:2nd, etc.)
        UserDetails[] nthList = grouping.Select( x => x.Skip(n-1).FirstOrDefault() ).Where( x => x != null ).ToArray() ;

注意:由於2d數組是鋸齒狀的 (因此,每個MSISDN可能沒有第n個元素,因此我們使用Skip(n-1).FirstOrDefault().Where( x => x != null )來丟掉丟失的項。

更通用的解決方案是采用grouping[][]並*對其行和列進行轉置,以使grouping[x][y]成為ranking[y][x] 這樣一來,您就可以將轉置后的ranking[][]視為具有ranking[0]UserDetails[] ,它是您在所有MSISDN值中ranking[0]第一的對象, ranking[0]是您在所有MSISDN值中ranking[0]第二的對象, MSISDN

您可能需要做的事情不只是簡單的轉換,因為對於任何大於0的n值,任何給定的MSISDN可能都沒有第n個項目。

我相信(未經測試)您可以使用LINQ進行二維轉置:

UserDetails[][] ranking = Enumerable
                          .Range( 0 ,grouping.Max(x => x.Length) )
                          .Select( rank => Enumerable
                                           .Range(0,grouping.Length)
                                           .Select( msisdn => grouping[msisdn].Skip(rank-1).FirstOrDefault() )
                                           .Where( x => x != null )
                                           .ToArray()
                          )
                          .ToArray()
                          ;

在該列表的末尾, ranking[0]應該是您的第一個列表, ranking[1]您的第二個列表, ranking[2]您的第三個列表。

因此,首先使用GroupBy對項目進行分組,然后可以遍歷這些組並將它們投影到IEnumerator對象,拉出仍剩下項目的組並產生下一個項目,直到這些組中沒有任何項目。

//TODO give better name
public static IEnumerable<IEnumerable<T>> Foo<T, TKey>(
    IEnumerable<T> source, Func<T, TKey> selector)
{
    var groups = source.GroupBy(selector)
        .Select(group => group.GetEnumerator())
        .ToList();
    while (groups.Any())
    {
        yield return groups.Select(iterator => iterator.Current);
        groups = groups.Where(iterator => iterator.MoveNext())
            .ToList();
    }
}

暫無
暫無

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

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