66230
C#で以下のような文字列があるとします。

```

    test1#2.00,2.00,4.07,sample1:sample2|test2#3.04,-2.59,4.07,tttt1:t2t2|testest#3.04,-2.59,4.07,tatata:chichichi
    
```

シャープの後のカンマで区切られた4つめの要素のみを抜き出して結合し、以下のような1つの文字列にしたいです。

```

    sample1:sample2,tttt1:t2t2,tatata:chichichi,
    
```

以下のようなプログラムを書いて同じ出力を得られたのですが、

```

    var combineStr = "";
    var strArray = "test1#2.00,2.00,4.07,sample1:sample2|test2#3.04,-2.59,4.07,tttt1:t2t2|testest#3.04,-2.59,4.07,tatata:chichichi";
    foreach (string message in strArray.ToString().Split(new Char[] { '|' }))
    {
        var strArray1 = message.Split(new Char[] { '#' });
        var commaList = strArray1[1].Split(new Char[] { ',' });
        combineStr += commaList[3];
        combineStr += ",";
    }
    System.Console.WriteLine(combineStr);
    
```

もうちょっと簡単に短く書く方法はないでしょうか？

実際には

```

    sample1:sample2,tttt1:t2t2,tatata:chichichi
    
```

のように最後のカンマをなくした状態で出力できるとより嬉しいです。

.NET Framework 3.5の環境を使っています。
CC BY-SA 4.0
2020-05-03T02:21:06.437
66228
2020-05-07T04:26:49.343
2020-05-07T04:26:49.343
4236
34471
question
c# unity3d
文字列の中から区切り文字で仕切って特定の要素を取り出したい
これぐらいでしょうか？

```

    var str = "test1#2.00,2.00,4.07,sample1:sample2|test2#3.04,-2.59,4.07,tttt1:t2t2|testest#3.04,-2.59,4.07,tatata:chichichi";
    var combined = String.Join(",",
        str.Split('|').Select(s => s.Split('#')[1].Split(',')[3])
    );
    Console.WriteLine(combined);
    
```

  * [`String.Split`メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.string.split?view=netframework-4.8)はオーバーロードがあり、[特にオプションを指定しない場合](https://docs.microsoft.com/ja-jp/dotnet/api/system.string.split?view=netframework-4.8#System_String_Split_System_Char___)、`params`指定されているため、文字配列を作らなくても引数として渡せます。
  * [`Enumerable.Select`拡張メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.select?view=netframework-4.8#System_Linq_Enumerable_Select__2_System_Collections_Generic_IEnumerable___0__System_Func___0___1__)を使用すれば、値を変換することができます。
  * [`String.Concatメソッド`](https://docs.microsoft.com/ja-jp/dotnet/api/system.string.concat?view=netframework-4.8)で単純な結合、[`String.Join`メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.string.join?view=netframework-4.8)で文字列を挟みながらの結合がそれぞれできます。

* * *

`String.Concatメソッド`や`String.Join`メソッドのうち`IEnumerable<T>`を受け付けるオーバーロードが追加されたのは.NET
Framework
4.0からです。そのため、それ以前の環境では[`Enumerable.ToArray()`拡張メソッド](https://docs.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.toarray?view=netframework-4.8)でいったん配列に変換する必要があります。

```

    // .NET Framework 3.5向け
    var combined = String.Join(",",
        str.Split('|').Select(s => s.Split('#')[1].Split(',')[3]).ToArray()
    );
    
```
CC BY-SA 4.0
2020-05-03T03:09:25.020
66230
2020-05-03T06:20:50.193
2020-05-03T06:20:50.193
4236
4236
66228
answer