質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

1052閲覧

Listの各要素の文字列から、共通した文字をつなげたい

mypace

総合スコア45

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/05/26 18:33

OS:Windows 10
言語:C#

下記コードのようにListを作成後、いくつかの処理を行い、
その結果を各要素に例として下記コードのように追加しております。

このListの各要素の文字列から、共通した文字をつなげていき、 ”A:B:C:D" , "E:F" のように
文字列として出力する関数を作成したいと考えております。
調べて作成しているのですが、参考になるサイトや方法等、ご存知でしたらお知恵をお借り出来ないでしょうか?

C#

1List<string> list = new List<string>(); 2 3//--- 処理結果をlistに追加 ---// 4list.Add("A:B"); 5list.Add("B:A"); 6list.Add("B:C"); 7list.Add("C:B"); 8list.Add("C:D"); 9list.Add("D:C"); 10list.Add("E:F"); 11list.Add("F:E"); 12 13//Listの各要素の文字列から ”A:B:C:D" のように共通した文字を1つにつなげたい

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/05/26 22:31

例のコードで、(A:C)があった場合どうなります?
退会済みユーザー

退会済みユーザー

2020/05/26 22:54

質問者さんの言う「共通」の定義を、ここに書いてあること以外は知り得ない第三者が読んで分かるように、文書化してください。
dodox86

2020/05/26 23:38

質問文中、 "A:B:C:D"と"E:F"が分かれているのがもう理解できませんね。もしかすると要素ごとにいずれかの文字で繋がっているものを共通、と言っていますか?"E:F"と"F:E"の2つの要素だけは"A"~"D"を含むグループと離れているように見えます。
mypace

2020/05/27 04:08

説明が不足しており大変申し訳ございません。 "A"や"B"等を要素としたとき、同じ要素が複数の文字列に使用される場合を ”共通”と定義しております。
guest

回答3

0

解決したようですが、自己満足で私も書きました。
入力がlist、出力が”A:B:C:D" , "E:F"の想定です。

:の左右にある文字のASCIIコードから差を求めて、B:AC:BD:CF:Eなどの連結に使えない文字列は除外しています。

C#

1public class Program{ 2 public static void Main(){ 3 List<string> list = new List<string>(); 4 list.Add("A:B"); 5 list.Add("B:A"); 6 list.Add("B:C"); 7 list.Add("C:B"); 8 list.Add("C:D"); 9 list.Add("D:C"); 10 list.Add("E:F"); 11 list.Add("F:E"); 12 13 var mergedList = list 14 .Where(x => x[2] - x[0] == 1) 15 .OrderBy(x => x) 16 .MergeByLastChar(); 17 18 foreach(var element in mergedList){ 19 Console.WriteLine(element); //{ "A:B:C:D", "E:F" } 20 } 21 } 22} 23 24public static class Extension{ 25 public static IEnumerable<string> MergeByLastChar(this IEnumerable<string> list){ 26 var merged = string.Empty; 27 foreach(var element in list){ 28 if(merged == string.Empty){ 29 merged = element; 30 continue; 31 } 32 33 var lastChar = merged.Last(); 34 if(element.StartsWith(lastChar.ToString())){ 35 merged += element.Substring(1); 36 continue; 37 } 38 39 yield return merged; 40 merged = element; 41 } 42 yield return merged; 43 } 44}

投稿2020/05/27 04:19

編集2020/05/27 04:34
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

{"A","B"}{"A","B","C,"D"}をグループ、
"A","B","C",...をグループの要素と呼ぶことにします。

やりたいことがグループのリストに対して、
「2つのグループに対して、一つでも共通する要素がある場合にはグループを結合する。」という操作を結合できる組み合わせがなくなるまで繰り返す
ということだとすると、

(入力は"X:Y"という文字列形式ではなく{"X","Y"}というリスト形式にしています。適宜変換してください)

csharp

1using System.Collections.Generic; 2using System.Linq; 3 4public class Main{ 5 static List<List<string>> Merge(List<List<string>> src){ 6 var tmp = src.ToList(); 7 for(int i=0;i<tmp.Count()-1;i++){ 8 for(int j=i+1; j<tmp.Count();j++){ 9 if(tmp[i].Intersect(tmp[j]).Count()>0){ 10 tmp[i] = tmp[i].Union(tmp[j]).ToList(); 11 tmp.RemoveAt(j); 12 return Merge(tmp); 13 } 14 } 15 } 16 return src; 17 } 18 19 public static void Main(){ 20 var src =new List<List<string>>{ 21 new List<string>{"A","B"}, 22 new List<string>{"B","A"}, 23 new List<string>{"C","D"}, 24 new List<string>{"G","H"}, 25 new List<string>{"I","I"}, 26 new List<string>{"E","F"}, 27 new List<string>{"A","C"}}; 28 var result = Merge(src); 29 result.ForEach(xs=>System.Console.WriteLine(string.Join(":",xs))); 30 31 /* 32 A:B:C:D 33 G:H 34 I:I 35 E:F 36 */ 37 38 39 } 40}

投稿2020/05/27 00:48

編集2020/05/27 01:01
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mypace

2020/05/27 04:11

ご回答いただき誠にありがとうございました。 非常にわかりやすく、望んでいた結果を取得する事ができました。
guest

0

共通した文字というのがよくわかりませんが、リストに追加されている:で区切られた文字列の内、複数回出現するものを:で連結した文字列を得たいということと解釈して回答します。
ただし出現順や一度のAdd時に同じ文字を2回追加しているケース(.Add("X:X")とか)している場合は考慮してません。

C#

1var list = new List<string>(); 2 3//--- 処理結果をlistに追加 ---// 4list.Add("A:B"); 5list.Add("B:A"); 6list.Add("B:C"); 7list.Add("C:B"); 8list.Add("C:D"); 9list.Add("D:C"); 10list.Add("E:F"); 11list.Add("F:E"); 12 13var array = list.Aggregate(new Dictionary<string, int>(), 14 (dic, v) => 15 { 16 var values = v.Split(':'); 17 foreach (var value in values) 18 { 19 if (dic.ContainsKey(value)) dic[value] += 1; 20 else dic.Add(value, 1); 21 } 22 return dic; 23 }).Where(kvp => 1 < kvp.Value).Select(kvp => kvp.Key) 24 .OrderBy(v => v) 25 .ToArray(); 26 27var result = string.Join(":", array); //A:B:C:D:E:F 28 29

投稿2020/05/26 19:40

draq

総合スコア2573

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問