2009-09-30 5 views
2
string[] arr = { "abcdefXXX872358", "abcdef200X8XXX58", "abcdef200X872359", "6T1XXXXXXXXXXXX11", "7AbcdeHA30XXX541", "7AbcdeHA30XXX691" }; 

comment puis-je obtenir des chiffres distincts d'en haut où le premier 6 caractère doit être distinct résultat seraitObtenez d'abord 6 caractères de chaîne qui est distincte

abcdefXXX872358

6T1XXXXXXXXXXXX11

7AbcdeHA30XXX541

J'essaie quelque chose comme ça

var dist = (from c in arr 
      select c).Select(a => a.Substring(0, 5)).Distinct(); 

qui me donne le premier caractère 5 mais je veux chaîne entière

Répondre

6

Groupe sur les premiers caractères, et obtenir la première chaîne dans chaque groupe:

IEnumerable<string> firstInGroup = 
    arr 
    .GroupBy(s => s.Substring(0, 6)) 
    .Select(g => g.First()); 
+0

La sous-chaîne doit être au niveau de la sous-chaîne (0, 5) peut être une faute de frappe – NETQuestion

+1

@lincs: Le deuxième paramètre est la longueur, et vous avez dit que les six premiers caractères doivent être distincts. – Guffa

0

Je pense que la meilleure méthode serait d'implémenter un IEqualityComparer, comme l'indique la surcharge de List.Distinct()

public class firstXCharsComparer : IEqualityComparer<string> 
    { 
     private int numChars; 
     public firstXCharsComparer(int numChars) 
     { 
      this.numChars = numChars; 
     } 

     public bool Equals(string x, string y) 
     { 
      return x.Substring(0, numChars) == y.Substring(0, numChars); 
     } 

     public int GetHashCode(string obj) 
     { 
      return obj.Substring(0, numChars).GetHashCode(); 
     } 
    } 
    static void Main(string[] args) 
    { 
     string[] arr = { "abcdefXXX872358", "abcdef200X8XXX58", "abcdef200X872359", "6T1XXXXXXXXXXXX11", "7AbcdeHA30XXX541", "7AbcdeHA30XXX691" }; 

     var result = arr.ToList().Distinct(new firstXCharsComparer(6)); 
     result.Count(); 
    }