জেনেরিক তালিকাটি CSV স্ট্রিংয়ে রূপান্তর করা


139

আমার কাছে পূর্ণসংখ্যার মানগুলির তালিকা রয়েছে (তালিকা) এবং কমা বিস্মৃত মানগুলির একটি স্ট্রিং উত্পন্ন করতে চাই। এটি একক কমা সীমানাঙ্কিত তালিকার তালিকার আউটপুটে সমস্ত আইটেম।

আমার চিন্তা ... 1. একটি পদ্ধতিতে তালিকাটি পাস করুন pass ২. তালিকাটি পুনরাবৃত্তি করতে এবং কমা যুক্ত করতে স্ট্রিংবিল্ডার ব্যবহার করুন the. শেষ অক্ষরটি পরীক্ষা করুন এবং যদি এটি কমা হয়, এটি মুছুন।

আপনার চিন্তা কি? এই সেরা উপায়?

আমি যদি ভবিষ্যতে কেবল পূর্ণসংখ্যাগুলি (আমার বর্তমান পরিকল্পনা) নয় স্ট্রিংস, লম্বা, ডাবলস, বুলস, ইত্যাদি ইত্যাদি পরিচালনা করতে চাইতাম তবে কীভাবে আমার কোড পরিবর্তন হবে? আমার ধারণা এটি কোনও প্রকারের একটি তালিকা গ্রহণ করে।

উত্তর:


243

ফ্রেমওয়ার্ক আমাদের জন্য ইতিমধ্যে কী করছে তা আশ্চর্যজনক।

List<int> myValues;
string csv = String.Join(",", myValues.Select(x => x.ToString()).ToArray());

সাধারণ ক্ষেত্রে:

IEnumerable<T> myList;
string csv = String.Join(",", myList.Select(x => x.ToString()).ToArray());

আপনি দেখতে পাচ্ছেন, এটি কার্যকরভাবে আলাদা নয়। সাবধান হোন যে আপনি সম্ভবত x.ToString()উদ্ধৃতিতে মোড়ানো প্রয়োজন (অর্থাত্‍ "\"" + x.ToString() + "\"") যদি x.ToString()কমা থাকে।

এর সামান্য বৈকল্পিকটিতে আকর্ষণীয় পড়ার জন্য: এরিক লিপার্টের ব্লগে কমা কুইবলিং দেখুন ।

দ্রষ্টব্য: এটি আগে লেখা হয়েছিল। নেট 4.0 আনুষ্ঠানিকভাবে প্রকাশিত হয়েছিল। এখন আমরা শুধু বলতে পারি

IEnumerable<T> sequence;
string csv = String.Join(",", sequence);

জমিদার ব্যবহার String.Join<T>(string, IEnumerable<T>)। এই পদ্ধতি স্বয়ংক্রিয়ভাবে উপাদান প্রকল্প হবে xথেকে x.ToString()


List<int>Select3.5 ফ্রেমওয়ার্কে পদ্ধতি নেই যদি না আমি কিছু মিস করি।
আজ

2
@ আজেহ: আপনি সম্ভবত একটি usingবিবৃতি অনুপস্থিত ।
জেসন

কোন নির্দিষ্ট আমদানি?
আজিহ

1
চেষ্টা করুন System.Linq.Enumerable(এবং অবশ্যই আপনার System.Core.dllসমাবেশ প্রয়োজন , তবে সম্ভবত আপনার এটি ইতিমধ্যে রয়েছে)। আপনি দেখুন, List<int> কখনো হয়েছে Selectএকটি পদ্ধতি হিসেবে। বরং এক্সটেনশন পদ্ধতি হিসাবে System.Linq.Enumerableসংজ্ঞা Selectদেয় IEnumerable<T>, যার List<int>একটি উদাহরণ। System.Linq.Enumerableএই এক্সটেনশন পদ্ধতিটি বেছে নেওয়ার জন্য আপনাকে আপনার আমদানিতে দরকার ।
জেসন

যদি আপনি সংখ্যাসূচক মানগুলি এবং কমাগুলি কোনও সমস্যা (লোকেলের উপর নির্ভর করে) ব্যবহার করেন তবে তার বিকল্প হ'ল x.ToString(CultureInfo.InvariantCulture)। এটি দশমিক বিভাজক হিসাবে সময়কাল ব্যবহার করবে।
হেলটনবাইকার

15

3.5 সালে, আমি এখনও এটি করতে সক্ষম হয়েছি। এটি আরও সহজ এবং ল্যাম্বডা দরকার নেই।

String.Join(",", myList.ToArray<string>());

ToArray()পদ্ধতি List<int>যদি না আমি কিছু অনুপস্থিত করছি Framework 3.5 টাইপ যুক্তি সঙ্গে ব্যবহার করা যাবে না।
আজ

উজ্জ্বল। শিশু ToString () ব্যবহৃত হয় বলে ToArray <string> এর কোনও প্রয়োজন নেই।
খ্রিস্টান

11

আপনি কোনও এক্সটেনশন পদ্ধতি তৈরি করতে পারেন যা আপনি যে কোনও মূলনীতিতে কল করতে পারেন:

public static string JoinStrings<T>(
    this IEnumerable<T> values, string separator)
{
    var stringValues = values.Select(item =>
        (item == null ? string.Empty : item.ToString()));
    return string.Join(separator, stringValues.ToArray());
}

তারপরে আপনি কেবলমাত্র মূল তালিকায় পদ্ধতিটি কল করতে পারেন:

string commaSeparated = myList.JoinStrings(", ");

7

আপনি ব্যবহার করতে পারেন String.Join

String.Join(
  ",",
  Array.ConvertAll(
     list.ToArray(),
     element => element.ToString()
  )
);

ConvertAllএখানে কল করতে জেনেরিক ধরণের পরামিতি নির্দিষ্ট করার দরকার নেই - উভয়ই intএবং stringঅনুমান করা হবে।
পাভেল মিনায়েভ

1
পরিবর্তে তালিকা তৈরি করুন Array.ConvertAll(...' you can just do on কনভার্টএল (ই => ই.টোস্ট্রিং ())। টুআর্রে) just, মাত্র কম টাইপিং।
ডেভিড

স্ট্রিং.জয়াইন (",", তালিকা); ঠিক জরিমানা করবে :)
খ্রিস্টান

6

যদি কোনও সংস্থা স্ট্রিংয়ের তালিকার পরিবর্তে কাস্টম শ্রেণীর অবজেক্টের তালিকায় রূপান্তর করতে চায় তবে আপনার শ্রেণীর সিএসভি সারি উপস্থাপনার মাধ্যমে আপনার শ্রেণীর টোস্ট্রিং পদ্ধতিটি ওভাররাইড করে।

Public Class MyClass{
   public int Id{get;set;}
   public String PropertyA{get;set;}
   public override string ToString()
   {
     return this.Id+ "," + this.PropertyA;
   }
}

তারপরে নীচের কোডটি এই শ্রেণীর তালিকাটি শিরোনাম কলাম সহ CSV এ রূপান্তর করতে ব্যবহার করা যেতে পারে

string csvHeaderRow = String.Join(",", typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(x => x.Name).ToArray<string>()) + Environment.NewLine;
string csv= csvHeaderRow + String.Join(Environment.NewLine, MyClass.Select(x => x.ToString()).ToArray());

myExample Colલેક્શન.এর পরিবর্তে MyClass.Select নির্বাচন করুন
ফেরেন্ক

5

@ ফ্র্যাঙ্কের দেওয়া লিঙ্কের কোডটি। নেট নেট জেনেরিক তালিকা থেকে একটি সিএসভি ফাইল তৈরি করুন, কোডটি ছাড়িয়ে যাওয়ার জন্য ,আমি কোডটি সংশোধন করে প্রতিটি লাইন শেষ করার একটি সামান্য সমস্যা ছিল opeএহেতু এটি কাউকে সহায়তা করে ope

/// <summary>
/// Creates the CSV from a generic list.
/// </summary>;
/// <typeparam name="T"></typeparam>;
/// <param name="list">The list.</param>;
/// <param name="csvNameWithExt">Name of CSV (w/ path) w/ file ext.</param>;
public static void CreateCSVFromGenericList<T>(List<T> list, string csvCompletePath)
{
    if (list == null || list.Count == 0) return;

    //get type from 0th member
    Type t = list[0].GetType();
    string newLine = Environment.NewLine;

    if (!Directory.Exists(Path.GetDirectoryName(csvCompletePath))) Directory.CreateDirectory(Path.GetDirectoryName(csvCompletePath));

    if (!File.Exists(csvCompletePath)) File.Create(csvCompletePath);

    using (var sw = new StreamWriter(csvCompletePath))
    {
        //make a new instance of the class name we figured out to get its props
        object o = Activator.CreateInstance(t);
        //gets all properties
        PropertyInfo[] props = o.GetType().GetProperties();

        //foreach of the properties in class above, write out properties
        //this is the header row
        sw.Write(string.Join(",", props.Select(d => d.Name).ToArray()) + newLine);

        //this acts as datarow
        foreach (T item in list)
        {
            //this acts as datacolumn
            var row = string.Join(",", props.Select(d => item.GetType()
                                                            .GetProperty(d.Name)
                                                            .GetValue(item, null)
                                                            .ToString())
                                                    .ToArray());
            sw.Write(row + newLine);

        }
    }
}

অতিরিক্ত তথ্য: প্রক্রিয়াটি 'সি: \ টেম্পল \ ম্যাচিং ওয়েভ সিএসভি' ফাইলটি অ্যাক্সেস করতে পারে না কারণ এটি অন্য প্রক্রিয়া দ্বারা ব্যবহৃত হচ্ছে। ফোল্ডারটি devবিদ্যমান, তবে ফাইলটি নয় ... আমি কি এটি সঠিকভাবে ব্যবহার করছি না?
টম স্টিকেল

File.Create পদ্ধতি ফাইলটি তৈরি করে এবং ফাইলটিতে একটি ফাইল স্ট্রিম খুলবে। সুতরাং আপনার ফাইল ইতিমধ্যে খোলা আছে। আপনার আসলে ফাইলের দরকার নেই। তৈরি পদ্ধতিটি মোটেও:
ডেভিড

কোনও সম্পত্তি যদি শূন্য হয়, তবে এর আশেপাশে কোনও উপায় আছে?
ড্যানিয়েল জ্যাকসন

@ ড্যানিয়েল জ্যাকসন আপনি এই বিবৃতিতে এমন একটি ধারা লিখতে পারেন যেখানে sw.Write(string.Join(",", props.Select(d => d.Name).ToArray()) + newLine);পরীক্ষা করা হয়নি তবে আপনি কী অর্জন করতে চাইছেন তা জানেন না
আলী উমাইর

4

আমি এই পোস্টে এটি গভীরভাবে ব্যাখ্যা । আমি এখানে সংক্ষিপ্ত বিবরণ দিয়ে কোডটি এখানে পেস্ট করব।

শিরোনাম সারি তৈরি করার পদ্ধতিটি এখানে। এটি কলামের নাম হিসাবে সম্পত্তির নাম ব্যবহার করে।

private static void CreateHeader<T>(List<T> list, StreamWriter sw)
    {
        PropertyInfo[] properties = typeof(T).GetProperties();
        for (int i = 0; i < properties.Length - 1; i++)
        {
            sw.Write(properties[i].Name + ",");
        }
        var lastProp = properties[properties.Length - 1].Name;
        sw.Write(lastProp + sw.NewLine);
    }

এই পদ্ধতিটি সমস্ত মান সারি তৈরি করে

private static void CreateRows<T>(List<T> list, StreamWriter sw)
    {
        foreach (var item in list)
        {
            PropertyInfo[] properties = typeof(T).GetProperties();
            for (int i = 0; i < properties.Length - 1; i++)
            {
                var prop = properties[i];
                sw.Write(prop.GetValue(item) + ",");
            }
            var lastProp = properties[properties.Length - 1];
            sw.Write(lastProp.GetValue(item) + sw.NewLine);
        }
    }

এবং এখানে সেই পদ্ধতিটি যা তাদের একত্রিত করে এবং আসল ফাইল তৈরি করে।

public static void CreateCSV<T>(List<T> list, string filePath)
    {
        using (StreamWriter sw = new StreamWriter(filePath))
        {
            CreateHeader(list, sw);
            CreateRows(list, sw);
        }
    }

1
এটি খুব ভাল কাজ করে। আমি প্যারামিটার হিসাবে ডিলিমিটারটি পাস করার জন্য এটি উন্নত করেছি, সুতরাং যে কোনও ধরণের সীমান্তের ফাইল তৈরি করা যায়। পাঠ্যে কমা রয়েছে কিনা তা মোকাবেলায় সিএসভিগুলি ব্যথা করছে, তাই আমি |উন্নত সংস্করণটি ব্যবহার করে সীমিত ফাইলগুলি তৈরি করি । ধন্যবাদ!
শিব

3

কোনও সমাধান কেবল তখনই তালিকার তালিকা তৈরি করে (স্ট্রিংয়ের)

যদি আপনার নিজস্ব অবজেক্টের জেনেরিক তালিকা থাকে যেমন গাড়ীর n বৈশিষ্ট্যযুক্ত তালিকা (গাড়ীর), তবে আপনাকে অবশ্যই প্রতিটি গাড়ী বস্তুর বৈশিষ্ট্যগুলি লুপ করতে হবে।

দেখুন: http://www.csharptocsharp.com/generate-csv-from-generic- তালিকা


1
আপনি কি ক্লাসের টস্ট্রিংকে ওভাররাইড করতে এবং উপরের পদ্ধতিগুলি ব্যবহার করতে পারবেন না?
গ্যাব্রিয়েল গাইমারিস

3

আমি একটি দুর্দান্ত সরল এক্সটেনশন পদ্ধতি পছন্দ করি

 public static string ToCsv(this List<string> itemList)
         {
             return string.Join(",", itemList);
         }

তারপরে আপনি কেবলমাত্র মূল তালিকায় পদ্ধতিটি কল করতে পারেন:

string CsvString = myList.ToCsv();

অন্যান্য পরামর্শগুলির তুলনায় পরিষ্কার এবং সহজে পড়া সহজ।


2

স্ট্রিং.জয়িনের সমস্যাটি হ'ল আপনি ইতিমধ্যে মানটিতে থাকা কমা সম্পর্কিত কেসটি পরিচালনা করছেন না। যখন কোনও কমা উপস্থিত থাকে তখন আপনি মূল্যগুলিতে মূল্যকে ঘিরে এবং সমস্ত বিদ্যমান উদ্ধৃতিগুলিকে দ্বিগুণ উদ্ধৃতি দিয়ে প্রতিস্থাপন করেন।

String.Join(",",{"this value has a , in it","This one doesn't", "This one , does"});

সিএসভি মডিউলটি দেখুন


2

সিএসভিহেল্পার লাইব্রেরি নুগেটে খুব জনপ্রিয় You https://github.com/JoshClose/CsvHelper/wiki/Basics

CSvHelper ব্যবহার করা সত্যিই সহজ। এটির ডিফল্ট সেটিংস সর্বাধিক সাধারণ দৃশ্যের জন্য সেটআপ করা হয়।

এখানে একটি সামান্য সেটআপ ডেটা।

Actors.csv:

Id,FirstName,LastName  
1,Arnold,Schwarzenegger  
2,Matt,Damon  
3,Christian,Bale

Actor.cs (কাস্টম ক্লাস অবজেক্ট যা কোনও অভিনেতাকে উপস্থাপন করে):

public class Actor
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

CSvReader ব্যবহার করে CSV ফাইলটি পড়া:

var csv = new CsvReader( new StreamReader( "Actors.csv" ) );

var অভিনয়List = csv.GetRecords ();

একটি সিএসভি ফাইলে লেখা হচ্ছে।

using (var csv = new CsvWriter( new StreamWriter( "Actors.csv" ) )) 
{
    csv.WriteRecords( actorsList );
}

2

যে কারণেই হোক না কেন, @ অলিউমায়ার তার উত্তরে সম্পাদনাটি উল্টে দিলেন যা তার কোডটিকে ঠিক হিসাবে চালিত করে না তা স্থির করে, তাই এখানে কার্যকারী সংস্করণ যা ফাইল অ্যাক্সেস ত্রুটি নেই এবং সঠিকভাবে নাল বস্তুর সম্পত্তি মানগুলি পরিচালনা করে:

/// <summary>
/// Creates the CSV from a generic list.
/// </summary>;
/// <typeparam name="T"></typeparam>;
/// <param name="list">The list.</param>;
/// <param name="csvNameWithExt">Name of CSV (w/ path) w/ file ext.</param>;
public static void CreateCSVFromGenericList<T>(List<T> list, string csvCompletePath)
{
    if (list == null || list.Count == 0) return;

    //get type from 0th member
    Type t = list[0].GetType();
    string newLine = Environment.NewLine;

    if (!Directory.Exists(Path.GetDirectoryName(csvCompletePath))) Directory.CreateDirectory(Path.GetDirectoryName(csvCompletePath));

    using (var sw = new StreamWriter(csvCompletePath))
    {
        //make a new instance of the class name we figured out to get its props
        object o = Activator.CreateInstance(t);
        //gets all properties
        PropertyInfo[] props = o.GetType().GetProperties();

        //foreach of the properties in class above, write out properties
        //this is the header row
        sw.Write(string.Join(",", props.Select(d => d.Name).ToArray()) + newLine);

        //this acts as datarow
        foreach (T item in list)
        {
            //this acts as datacolumn
            var row = string.Join(",", props.Select(d => $"\"{item.GetType().GetProperty(d.Name).GetValue(item, null)?.ToString()}\"")
                                                    .ToArray());
            sw.Write(row + newLine);

        }
    }
}

1

http://cc.davelozinski.com/c-sharp/the-fastest-way-to-read-and-process-text-files

এই ওয়েবসাইটটি বাফার লেখক ব্যবহার করে কোনও ফাইলকে কীভাবে লিখতে হবে সে সম্পর্কে কিছু বিস্তৃত পরীক্ষা করেছিল, লাইন দ্বারা লাইন পঠন সবচেয়ে ভাল উপায় বলে মনে হয়, স্ট্রিং বিল্ডার ব্যবহার করা সবচেয়ে ধীর ছিল।

আমি ফাইলগুলি স্টাফ লেখার জন্য এটির কৌশলগুলি বেশ কার্যকরভাবে ব্যবহার করি যাতে এটি ভাল কাজ করে।


1

একটি সাধারণ উদ্দেশ্য ToCsv () এক্সটেনশন পদ্ধতি:

  • ইনট 16/32/64, ফ্লোট, ডাবল, ডেসিমাল এবং টোস্ট্রিংকে সমর্থন করে এমন কিছু সমর্থন করে ()
  • Ptionচ্ছিক কাস্টম জোড় বিভাজক
  • Customচ্ছিক কাস্টম নির্বাচনকারী
  • Ptionচ্ছিক নাল / খালি হ্যান্ডলিং স্পেসিফিকেশন (* অপ্ট () ওভারলোড)

ব্যবহারের উদাহরণ:

"123".ToCsv() // "1,2,3"
"123".ToCsv(", ") // "1, 2, 3"
new List<int> { 1, 2, 3 }.ToCsv() // "1,2,3"

new List<Tuple<int, string>> 
{ 
    Tuple.Create(1, "One"), 
    Tuple.Create(2, "Two") 
}
.ToCsv(t => t.Item2);  // "One,Two"

((string)null).ToCsv() // throws exception
((string)null).ToCsvOpt() // ""
((string)null).ToCsvOpt(ReturnNullCsv.WhenNull) // null

বাস্তবায়ন

/// <summary>
/// Specifies when ToCsv() should return null.  Refer to ToCsv() for IEnumerable[T]
/// </summary>
public enum ReturnNullCsv
{
    /// <summary>
    /// Return String.Empty when the input list is null or empty.
    /// </summary>
    Never,

    /// <summary>
    /// Return null only if input list is null.  Return String.Empty if list is empty.
    /// </summary>
    WhenNull,

    /// <summary>
    /// Return null when the input list is null or empty
    /// </summary>
    WhenNullOrEmpty,

    /// <summary>
    /// Throw if the argument is null
    /// </summary>
    ThrowIfNull
}   

/// <summary>
/// Converts IEnumerable list of values to a comma separated string values.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values">The values.</param>        
/// <param name="joinSeparator"></param>
/// <returns>System.String.</returns>
public static string ToCsv<T>(
    this IEnumerable<T> values,            
    string joinSeparator = ",")
{
    return ToCsvOpt<T>(values, null /*selector*/, ReturnNullCsv.ThrowIfNull, joinSeparator);
}

/// <summary>
/// Converts IEnumerable list of values to a comma separated string values.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values">The values.</param>
/// <param name="selector">An optional selector</param>
/// <param name="joinSeparator"></param>
/// <returns>System.String.</returns>
public static string ToCsv<T>(
    this IEnumerable<T> values,
    Func<T, string> selector,            
    string joinSeparator = ",") 
{
    return ToCsvOpt<T>(values, selector, ReturnNullCsv.ThrowIfNull, joinSeparator);
}

/// <summary>
/// Converts IEnumerable list of values to a comma separated string values.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values">The values.</param>
/// <param name="returnNullCsv">Return mode (refer to enum ReturnNullCsv).</param>
/// <param name="joinSeparator"></param>
/// <returns>System.String.</returns>
public static string ToCsvOpt<T>(
    this IEnumerable<T> values,
    ReturnNullCsv returnNullCsv = ReturnNullCsv.Never,
    string joinSeparator = ",")
{
    return ToCsvOpt<T>(values, null /*selector*/, returnNullCsv, joinSeparator);
}

/// <summary>
/// Converts IEnumerable list of values to a comma separated string values.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="values">The values.</param>
/// <param name="selector">An optional selector</param>
/// <param name="returnNullCsv">Return mode (refer to enum ReturnNullCsv).</param>
/// <param name="joinSeparator"></param>
/// <returns>System.String.</returns>
public static string ToCsvOpt<T>(
    this IEnumerable<T> values, 
    Func<T, string> selector,
    ReturnNullCsv returnNullCsv = ReturnNullCsv.Never,
    string joinSeparator = ",")
{
    switch (returnNullCsv)
    {
        case ReturnNullCsv.Never:
            if (!values.AnyOpt())
                return string.Empty;
            break;

        case ReturnNullCsv.WhenNull:
            if (values == null)
                return null;
            break;

        case ReturnNullCsv.WhenNullOrEmpty:
            if (!values.AnyOpt())
                return null;
            break;

        case ReturnNullCsv.ThrowIfNull:
            if (values == null)
                throw new ArgumentOutOfRangeException("ToCsvOpt was passed a null value with ReturnNullCsv = ThrowIfNull.");
            break;

        default:
            throw new ArgumentOutOfRangeException("returnNullCsv", returnNullCsv, "Out of range.");
    }

    if (selector == null)
    {
        if (typeof(T) == typeof(Int16) || 
            typeof(T) == typeof(Int32) || 
            typeof(T) == typeof(Int64))
        {                   
            selector = (v) => Convert.ToInt64(v).ToStringInvariant();
        }
        else if (typeof(T) == typeof(decimal))
        {
            selector = (v) => Convert.ToDecimal(v).ToStringInvariant();
        }
        else if (typeof(T) == typeof(float) ||
                typeof(T) == typeof(double))
        {
            selector = (v) => Convert.ToDouble(v).ToString(CultureInfo.InvariantCulture);
        }
        else
        {
            selector = (v) => v.ToString();
        }            
    }

    return String.Join(joinSeparator, values.Select(v => selector(v)));
}

public static string ToStringInvariantOpt(this Decimal? d)
{
    return d.HasValue ? d.Value.ToStringInvariant() : null;
}

public static string ToStringInvariant(this Decimal d)
{
    return d.ToString(CultureInfo.InvariantCulture);
}

public static string ToStringInvariantOpt(this Int64? l)
{
    return l.HasValue ? l.Value.ToStringInvariant() : null;
}

public static string ToStringInvariant(this Int64 l)
{
    return l.ToString(CultureInfo.InvariantCulture);
}

public static string ToStringInvariantOpt(this Int32? i)
{
    return i.HasValue ? i.Value.ToStringInvariant() : null;
}

public static string ToStringInvariant(this Int32 i)
{
    return i.ToString(CultureInfo.InvariantCulture);
}

public static string ToStringInvariantOpt(this Int16? i)
{
    return i.HasValue ? i.Value.ToStringInvariant() : null;
}

public static string ToStringInvariant(this Int16 i)
{
    return i.ToString(CultureInfo.InvariantCulture);
}

0

এখানে আমার এক্সটেনশন পদ্ধতিটি রয়েছে, এটি সরলতার জন্য একটি স্ট্রিং প্রদান করে তবে আমার বাস্তবায়ন ফাইলটিকে একটি ডেটা হ্রদে লেখায়।

এটি যে কোনও ডিলিমিটারের জন্য সরবরাহ করে, স্ট্রিংয়ে উদ্ধৃতি যোগ করে (যদি তারা ডিলিমিটার ধারণ করে থাকে) এবং ডিলগুলি শূন্য এবং ফাঁকা দেবে।

    /// <summary>
    /// A class to hold extension methods for C# Lists 
    /// </summary>
    public static class ListExtensions
    {
        /// <summary>
        /// Convert a list of Type T to a CSV
        /// </summary>
        /// <typeparam name="T">The type of the object held in the list</typeparam>
        /// <param name="items">The list of items to process</param>
        /// <param name="delimiter">Specify the delimiter, default is ,</param>
        /// <returns></returns>
        public static string ToCsv<T>(this List<T> items, string delimiter = ",")
        {
            Type itemType = typeof(T);
            var props = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(p => p.Name);

            var csv = new StringBuilder();

            // Write Headers
            csv.AppendLine(string.Join(delimiter, props.Select(p => p.Name)));

            // Write Rows
            foreach (var item in items)
            {
                // Write Fields
                csv.AppendLine(string.Join(delimiter, props.Select(p => GetCsvFieldasedOnValue(p, item))));
            }

            return csv.ToString();
        }

        /// <summary>
        /// Provide generic and specific handling of fields
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="p"></param>
        /// <param name="item"></param>
        /// <returns></returns>
        private static object GetCsvFieldasedOnValue<T>(PropertyInfo p, T item)
        {
            string value = "";

            try
            {
                value = p.GetValue(item, null)?.ToString();
                if (value == null) return "NULL";  // Deal with nulls
                if (value.Trim().Length == 0) return ""; // Deal with spaces and blanks

                // Guard strings with "s, they may contain the delimiter!
                if (p.PropertyType == typeof(string))
                {
                    value = string.Format("\"{0}\"", value);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return value;
        }
    }

ব্যবহার:

 // Tab Delimited (TSV)
 var csv = MyList.ToCsv<MyClass>("\t");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.