简体   繁体   中英

C# check conversion from List<string> to single string using String.Join, is possible or not?

I have one List<string> which length is undefined, and for some purpose I'm converting entire List<string> to string , so I want's to check before conversion that it is possible or not(is it gonna throw out of memory exception?) so I can process that much data and continue in another batch.

Sample

int drc = ImportConfiguration.Data.Count;
List<string> queries = new List<string>() { };

//iterate over data row to generate query and execute it
for (int drn = 0; drn < drc; drn++)//drn stands to Data Row Number
{
    queries.Add(Generate(ImportConfiguration.Data[drn], drn));

//SO HERE I WANT"S TO CHECK FOR SIZE
//IF IT"S NOT POSSIBLE IN  NEXT ITERATION THAN I'LL EXECUTE IT RIGHT NOW
//AND EMPTIED LIST AGAIN FOR NEXT BATCH

    if (drn == drc - 1 || drn % 5000 == 0)
    {
        SqlHelper.ExecuteNonQuery(connection, System.Data.CommandType.Text, String.Join(Environment.NewLine, queries));
        queries = new List<string>() { };
    }
}

You could try:

List<string> theList;

try {
    String allString = String.Join(",", theList.ToArray());
} catch (OutOfMemoryException e) {
    // ... handle OutOfMemoryException exception (e)
}

EDIT

Based on your comment.

You could give an estimation in the following way.

  1. Get available memory: Take a look at this post
  2. Get sum size of your list strings theList.Sum(s => s.Length);

     List<string> theList = new List<string>{ "AAA", "BBB" }; // number of characters var allSize = theList.Sum(s => s.Length); // available memory Process proc = Process.GetCurrentProcess(); var availableMemory = proc.PrivateMemorySize64;; if (availableMemory > allSize) { // you can try try { String allString = String.Join(",", theList.ToArray()); } catch (OutOfMemoryException e) { // ... handle OutOfMemoryException exception (e) } } else { // it is not going to work... } 

I can't say it is not possible but I think a better way would be to do the join and catch any exceptions:

try
{
     var joined = string.Join(",", list);
}
catch(OutOfMemoryException)
{
     // join failed, take action (log, notify user, etc.)
}

Note: if the exception is happening, then you need to consider a different approach than using a list and joining.

由于您尝试向SQL Server实例发送大量文本,因此可以在使用过程中使用SQL Server的流支持将字符串写入流中,从而最大程度地减少了构造要发送的数据所需的内存量。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM