2016-04-08 21 views
0

指定された文字列の重複を探したい、私はコレクションを試みましたが、うまくいきましたが、文字列の処理方法がわかりません。ここでCで指定された文字列の重複を見つける方法#

は、私がコレクションのためにしようとしたコードは、ある

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(); 

しかし、私は以下の文字列の重複を見つけるために、配列に格納したいです。どうやってするか?私は重複した文字を検索し、配列

でそれを保存したい上記の文字列で

eg:- string aa = "elements"; 

誰も私を助けることができますか?

+1

あなたのコードは、重複を見つけるために、正常に動作します。あなたの質問はどういう意味ですか? ''要素 ''が重複した単語であることがわかりますか?その場合は、重複リストを作成した後で 'if(duplicates.Contains(" elements ")){}'をチェックしてください。 – Rhumborl

+0

string a = "elements" =>ここでは重複する文字を見つけてそれを配列に格納したい – Aishu

答えて

2
012グループ値に
1

List<>の代わりに、HashSet<>を使用します。重複が許可されていないため、Addが返されますので、その場合はfalseが返されます。より効率的です。私はまた、各文字の数を追跡する代わりに、リストのDictionary<TKey,Tvalue>を使用したい:

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); 
} 

は今、あなたはHashSet内のすべてのユニークな重複文字と辞書内の各ユニークな文字の数を持っています。この例では、文字列に3回あるので、セットにはeしか含まれていません。

だから、次の方法で出力することができます、ここでの唯一の重複文字とそのカウントが含まれているにもDictionaryを作成LINQワンライナーは、それは価値がある何のため

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

です。

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

標準的な方法を最初に理解する必要があるため、2番目の方法として示しました。

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

あなたが

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

中間のWordCountは必要ありません。単にname.Split( '').GroupBy(x => x).Where(y => y.Count()> 1).Select(z => z.Key)。 ToList(); ' – Rhumborl

2

文字列は文字の配列である `LINQを介してこれを行うことができます。だから、コレクションのアプローチを使うことができます。 しかし、私はタイプされたHashSetを推薦するでしょう。文字列でロードすれば、重複なく、保存された順序で文字列を取得できます。

見てみましょう:

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

非常にすっきりしたアイデアですが、重複は何ですか? – Rhumborl

+0

親切に改善提案 – Nino

3

LINQのソリューション:

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)); 

文字列内の重複文字で同じprincicple:

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

使用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(); 
} 

は次に、あなたはこのように、これらの拡張機能を使用します。

var list = new List<string> { "a", "b", "b", "c" }; 
var duplicatedValues = list.GetDuplicates(); 
関連する問題