2010-04-14 3 views
0

j'ai une matrice, la matrice IEnumerable<IEnumerable<int>>, par exemple:LINQ pour filtrer les lignes d'une matrice basée sur l'inclusion dans un tableau

{ {10,23,16,20,2,4}, {22,13,1,33,21,11 }, {7,19,31,12,6,22}, ... } 

et un autre tableau:

int[] arr={ 10, 23, 16, 20} 

Je veux filtrer la matrice à la condition que je groupe toutes les lignes de la matrice qui contiennent le même nombre d'éléments de arr. C'est-à-dire que la première rangée de la matrice {10,23,16,20,2,4} a 4 numéros de arr, ce tableau doit être groupé avec le reste des rangées avec 4 nombres de arr.

préférable d'utiliser linq, merci beaucoup!

+0

J'ai édité votre question selon la façon dont je l'ai interprétée - s'il vous plaît laissez-nous savoir si j'étais incorrect. –

Répondre

0

Cela a fonctionné pour moi:

private static void Main(string[] args) 
{ 
    int[] searchNums = new int[] {10, 23, 16, 20}; 
    var groupByCount = from o in lists 
         group o by o.Count(num => searchNums.Contains(num)) into g 
         orderby g.Key 
         select g; 
    foreach(var grouping in groupByCount) 
    { 
     int countSearchNums = grouping.Key; 
     Console.WriteLine("Lists that have " + countSearchNums + " of the numbers:"); 
     foreach(IEnumerable<int> list in grouping) 
     { 
      Console.WriteLine("{{ {0} }}", String.Join(", ", list.Select(o => o.ToString()).ToArray())); 
     } 
    } 
    Console.ReadKey(); 
} 

private static List<List<int>> lists = new List<List<int>> 
{ 
    new List<int> {10, 23, 16, 20, 2, 4}, 
    new List<int> {22, 13, 1, 33, 21, 11}, 
    new List<int> {7, 19, 31, 12, 6, 22}, 
    new List<int> {10, 13, 31, 12, 6, 22}, 
    new List<int> {10, 19, 20, 16, 6, 22}, 
    new List<int> {10}, 
    new List<int> {10, 13, 16, 20}, 
}; 

Sortie:

listes qui ont 0 des numéros:
{22, 13, 1, 33, 21, 11}
{ 7, 19, 31, 12, 6, 22}
Listes qui ont 1 des nombres:
{10, 13, 31, 12, 6, 22}
{10}
listes qui ont trois des numéros:
{10, 19, 20, 16, 6, 22}
{10, 13, 16, 20}
listes qui ont quatre des numéros:
{10 , 23, 16, 20, 2, 4}

+0

Pour un crédit supplémentaire, changez 'lists' en' lists.AsParallel() 'dans la requête LINQ - ** BAM! ** Multithreading instantané! (VS 2010 seulement) –

+0

D'abord merci votre aide exceptionnelle, mais en fait l'int [] searchNums est aussi une matrice, comme int [] [] cj = {{10, 23, 16, 20}, {22, 13, 1, 33}, {7, 19, 31, 12}}, comment dois-je faire? Merci! –

+0

Eh bien, si la question est la même, il suffit de combiner cela dans un tableau à une dimension ... –

Questions connexes