0


0

私は、id、name、addressのような次のフィールドを持つinfoクラスを持っています、そしてListのようなその情報のリストを作成しました。

linqを使ってlistのすべての値をカンマ区切りの文字列にしたい。 これには方法がありますか。

3 Answer


0


http://mikehadlow.blogspot.com/2008/06/linq-to-csv.html[Mike Hadlowによる例]をご覧ください。 それはいくつかの改善(エスケープコンマ、改行サポートなど)を必要としますが、あなたに基本的な考えを与えます。


0


http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx[LINQによるバッチ更新と削除]にあるLinQExtensions.csから取得SQLへ]
///
/// IQueryableクエリから* .csvファイルを作成し、「単純な」プロパティ/フィールドをダンプします。 /// ///実行するSELECTクエリを表します。 ///作成するファイルの名前。 /// ///で指定したファイルが存在する場合は削除されます。 ///エンティティセットであるプロパティが含まれている場合 FK関係からの行)値はファイルにダンプされません。 ///このメソッドはデバッグ目的やLINQPadなどの他のユーティリティで使用する場合に役立ちます。 /// public static void DumpCSV(このIQueryableクエリ、文字列fileName){query.DumpCSV(fileName、true);} }

/// /// IQueryableクエリから* .csvファイルを作成し、「単純な」プロパティ/フィールドをダンプします。 /// ///実行するSELECTクエリを表します。 ///作成するファイルの名前。 ///で指定されたファイルを削除するかどうか /// ///エンティティセットであるプロパティが含まれている場合 FK関係からの行)値はファイルにダンプされません。 ///このメソッドはデバッグ目的やLINQPadなどの他のユーティリティで使用する場合に役立ちます。 /// public static void DumpCSV(このIQueryableクエリ、文字列fileName、ブールdeleteFile){if(File.Exists(fileName)

using(var output = new FileStream(fileName、FileMode.CreateNew)){using(var writer = new StreamWriter(出力)){var firstRow = true;

PropertyInfo [] properties = null。 FieldInfo [] fields = null。タイプtype = null。 bool typeIsAnonymous = false;

foreach(クエリのvar r){if(type == null){type = r.GetType(); typeIsAnonymous = type.IsAnonymous(); properties = type.GetProperties(); fields = type.GetFields(); }

var firstCol = true;

if(typeIsAnonymous){if(firstRow){foreach(プロパティのvar p){if(!firstCol)writer.Write( "、"); else {firstCol = false; }

writer.Write(p.Name); writer.WriteLine(); firstRow = false; firstCol = true;

foreach(プロパティのvar p){if(!firstCol)writer.Write( "、"); else {firstCol = false; DumpValue(p.GetValue(r、null)、writer); }} else {if(firstRow){foreach(フィールド内のvar p){if(!firstCol)writer.Write( "、");} else {firstCol = false; }

writer.Write(p.Name); writer.WriteLine(); firstRow = false; firstCol = true;

foreach(フィールド内のvar p){if(!firstCol)writer.Write( "、"); else {firstCol = false; }

DumpValue(p.GetValue(r)、writer); }}

writer.WriteLine(); }}}}

private static void DumpValue(オブジェクトv、StreamWriterライター){if(v!= null){switch(Type.GetTypeCode(v.GetType())){// csvエンコード値のケースTypeCode.String:string value =(string )v。 if(value.Contains( "、")|| value.Contains( '"')|| value.Contains(" \ n ")){value = value.Replace(" \ ""、 "\" \ "" ;

if(value.Length> 31735){value = value.Substring(0、31732) "..."; writer.Write( "\" "value" \ ""); } else {writer.Write(value);}破る;

デフォルト:writer.Write(v);ブレーク; }}}

プライベート静的bool IsAnonymous(この型){if(type == null);新しいArgumentNullException( "type");

// HACK:今のところ無名型を検出する唯一の方法。 Attribute.IsDefined(type、typeof(CompilerGeneratedAttribute)、false)を返します。

}


0


簡単な方法…​ 最速ではないかもしれないので、処理しているレコードの数によります

var myObjects = new [] {new {id = 1、name = "Matt"、address = "1234チャンスなしln \ r \ nnowhere、OH 12345"}、new {id = 1、name = "Jim"、address = "4321チャンスがありませんln \ r \ nnowhere、OH 12345"}};

var myList =(myObjectsのoからstring.Format( "{0}、\" {1} \ "、\" {2} \ ""、o.id、o.name、(o.address ?? string.Empty).Replace( "\ r \ n"、 ";")))。ToList();