2016-04-08 22 views
0

Belirli bir dize için çiftleri bulmak istiyorum, koleksiyonlar için denedim, İyi çalışıyor, ama bir dize için nasıl yapılacağını bilmiyorum. İşte Verilen dize içinde çiftleri bulmak için nasıl C#

Ben koleksiyonları için çalıştı kodu

string name = "this is a a program program"; 
string[] arr = name.Split(' '); 

var myList = new List<string>(); 
var duplicates = new List<string>(); 

foreach(string res in arr) 
{ 
    if (!myList.Contains(res)) 
    { 
     myList.Add(res); 
    } 
    else 
    { 
     duplicates.Add(res); 
    } 
} 

foreach(string result in duplicates) 
{ 
    Console.WriteLine(result); 
} 

Console.ReadLine(); 

olduğu Ama aşağıda dize için çiftleri bulmak için bir dizi içinde saklayın istiyorum. Bu nasıl yapılır? i yinelenen karakterleri bulup

Herkes bana yardımcı olabilir Bir dizide saklamak istediğiniz Yukarıdaki dizesi

eg:- string aa = "elements"; 

?

+1

kod çiftleri bulmak için çalışıyor. Sorunun ne demek istiyorsun? "Öğeler" in yinelenen bir kelime olup olmadığını mı kastediyorsunuz? Eğer öyleyse, '' (duplicates.Contains ("elements")) {} 'yinelenen listenizi oluşturduktan sonra kontrol edin – Rhumborl

+0

string a =" elements "=> Burada yinelenen bir karakter bulmak ve onu bir dizide saklamak istiyorum – Aishu

cevap

2
012: Bir dize içinde yinelenen karakterler için

string name = "this is a a program program"; 

    String[] result = name.Split(' ') 
    .GroupBy(word => word) 
    .Where(chunk => chunk.Count() > 1) 
    .Select(chunk => chunk.Key) 
    .ToArray(); 

    Console.Write(String.Join(Environment.NewLine, result)); 

aynı princicple Grup değerlere

1

List<> yerine HashSet<> kullanıyorum, çünkü bu iki kopyaya izin vermiyor ve Add bu durumda false döndürüyor. Daha verimli.

string text = "elements"; 
var duplicates = new HashSet<char>(); 
var duplicateCounts = new Dictionary<char, int>(); 

foreach (char c in text) 
{ 
    int charCount = 0; 
    bool isDuplicate = duplicateCounts.TryGetValue(c, out charCount); 
    duplicateCounts[c] = ++charCount; 
    if (isDuplicate) 
     duplicates.Add(c); 
} 

Şimdi HashSet tamamı özel yinelenen karakter ve sözlükte benzersiz her char değerlerine sahipti: Ben de her char sayısını izlemek için yerine listesinin bir Dictionary<TKey,Tvalue> kullanmayı tercih ediyorum. Bu örnekte, set yalnızca e içeriyor, çünkü dizede üç kez bulunuyor. Aşağıdaki şekilde

Yani olabilir çıktı it: Ne olursa olsun için

foreach(char dup in duplicates) 
    Console.WriteLine("Duplicate char {0} appears {1} times in the text." 
        , dup 
        , duplicateCounts[dup]); 

, burada da sadece yinelenen karakter ve onların sayımını içeren bir Dictionary oluşturan bir LINQ tek satırlık var:

Dictionary<char, int> duplicateCounts = text 
      .GroupBy(c => c) 
      .Where(g => g.Count() > 1) 
      .ToDictionary(g => g.Key, g => g.Count()); 

Bunu ikinci yaklaşım olarak gösterdim çünkü ilk önce standart yolu anlamanız gerekir.

0
 string name = "this is a a program program"; 
     var arr = name.Split(' ').ToArray(); 
     var dup = arr.Where(p => arr.Count(q => q == p) > 1).Select(p => p); 
     HashSet<string> hash = new HashSet<string>(dup); 
     string duplicate = string.Join(" ", hash); 
0

Sen

string name = "this is a a program program"; 
var d = name.Split(' ').GroupBy(x => x).Select(y => new { word = y.Key, Wordcount = y.Count() }).Where(z=>z.cou > 1).ToList(); 
+0

Arayıcı WordCount'a gerek yok, sadece 'name.Split ('') .GroupBy (x => x) .Where (y => y.Count()> 1) .Select (z => z.Key). ToList(); ' – Rhumborl

2

dize karakter dizisi olan `LINQ ile gerçekleştirebilir. Böylece koleksiyon yaklaşımınızı kullanabilirsiniz. Ancak, yazdığım HashSet'i öneriyorum. Sadece dize ile yükleyin ve korunmuş sipariş ile çiftleri olmadan chars dizisi alırsınız.

bir göz atın:

string s = "aaabbcdaaee"; 
    HashSet<char> hash = new HashSet<char>(s); 
    HashSet<char> hashDup = new HashSet<char>(); 
    foreach (var c in s) 
    if (hash.Contains(c)) 
     hash.Remove(c); 
    else 
     hashDup.Add(c); 
    foreach (var x in hashDup) 
    Console.WriteLine(x); 
    Console.ReadKey(); 
+0

Çok düzgün bir fikir - ama yinelenenler hangileridir? – Rhumborl

+0

Mottor, iyileştirme önerdi – Nino

3

Linq çözüm:

String source = "elements"; 

Char[] result = source 
    .GroupBy(c => c) 
    .Where(chunk => chunk.Count() > 1) 
    .Select(chunk => chunk.Key) 
    .ToArray(); 

// result = ['e'] 
Console.Write(String.Join(Environment.NewLine, result)); 
0

Kullanım LINQ:

public static IEnumerable<T> GetDuplicates<T>(this IEnumerable<T> list) 
{ 
    return list.GroupBy(item => item).SelectMany(group => group.Skip(1)); 
} 

public static bool HasDuplicates<T>(this IEnumerable<T> list) 
{ 
    return list.GetDuplicates().IsNotEmpty(); 
} 

Sonra böyle bu uzantıları kullanın:

var list = new List<string> { "a", "b", "b", "c" }; 
var duplicatedValues = list.GetDuplicates(); 
İlgili konular