Csharp/C#教程:转换整数数组以在SQL“IN”子句中使用分享


转换整数数组以在SQL“IN”子句中使用

当然有一个框架方法给出一个整数数组,字符串等将它们转换成一个可以在SQL“ IN ”子句中使用的列表?

例如

 int[] values = {1,2,3}; 

会去的

 "(1,2,3)" 

 var inClause = "(" + String.Join(",", values.Select(x => x.ToString()).ToArray()) + ")"; 

注意 :您不再需要在.NET Framework 4中调用.ToArray() 。添加了一个新的String.Join(string separator, IEnumerable values)方法。

您可以使用String.Join方法,如下所示:

 var str = "(" + string.Join(", ", Array.ConvertAll(values, v => v.ToString(CultureInfo.InvariantCulture))); 

假设values是一个数组, Array.ConvertAll应该比带有ToArray LINQ更有效。

如果您无权访问.NET 3.5扩展方法,则可以执行以下操作:

 StringBuilder sb = new StringBuilder(); sb.Append('('); foreach (int i in values) { sb.Append(i).Append(','); } // remove final , sb.Length -= 1; sb.Append(')'); string inValue = sb.ToString(); 

哪个适用于.NET 2

这也可以在一行中完成

 public string ToInStatement(this int[] values) { string[] stringValues = Array.ConvertAll(values, Convert.ToString); string result = "(" + String.Join(",", stringValues) + ")"; return result; } 

如果整数列表很大,则可能最终生成的字符串太长,数据库无法接受。 例如,我认为SQL2000中VARCHAR的最大长度约为8K。

所以我有一组辅助方法,如下面的示例,它返回一个字符串的枚举,然后可以按如下方式使用:

 List idList = ...; using(SqlCommand command = ...) { ... foreach(string idString in ConcatenateValues(ids,",", maxLength, false)) { command.Parameters[...] = idString; // or command.CommandText = "SELECT ... IN (" + idString + ")..."; ... execute command ... } } 

连接方法可能如下所示:

 public static IEnumerable ConcatenateValues(IEnumerable values, string separator, int maxLength, bool skipDuplicates) { IDictionary valueDictionary = null; StringBuilder sb = new StringBuilder(); if (skipDuplicates) { valueDictionary = new Dictionary(); } foreach (int value in values) { if (skipDuplicates) { if (valueDictionary.ContainsKey(value)) continue; valueDictionary.Add(value, ""); } string s = value.ToString(CultureInfo.InvariantCulture); if ((sb.Length + separator.Length + s.Length) > maxLength) { // Max length reached, yield the result and start again if (sb.Length > 0) yield return sb.ToString(); sb.Length = 0; } if (sb.Length > 0) sb.Append(separator); sb.Append(s); } // Yield whatever's left over if (sb.Length > 0) yield return sb.ToString(); } 

您可以使用以下扩展方法更有效地执行此操作:

  ///Appends a list of strings to a StringBuilder, separated by a separator string. ///The StringBuilder to append to. ///The strings to append. ///A string to append between the strings. public static StringBuilder AppendJoin(this StringBuilder builder, IEnumerable strings, string separator) { if (builder == null) throw new ArgumentNullException("builder"); if (strings == null) throw new ArgumentNullException("strings"); if (separator == null) throw new ArgumentNullException("separator"); bool first = true; foreach (var str in strings) { if (first) first = false; else builder.Append(separator); builder.Append(str); } return builder; } ///Combines a collection of strings into a single string. public static string Join(this IEnumerable strings, string separator, Func selector) { return strings.Select(selector).Join(separator); } ///Combines a collection of strings into a single string. public static string Join(this IEnumerable strings, string separator) { return new StringBuilder().AppendJoin(strings, separator).ToString(); } 

嘿,很棒的建议,下面稍作修改

上述就是C#学习教程:转换整数数组以在SQL“IN”子句中使用分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public static class IEnumerableExtensions { // reasonable to assume you will use this everywhere, not just // Sql statements, but log statements, anywhere you need to // dump a list into a readable format! // // HINT: extra credit: you can generalize this, and provide // specialized short hands that invoke the general method public static string ToCommaSeparatedString(this IEnumerable values) { // SIGH: so apparently this does not generate minimal // assembler on every machine, please note the following // is written for clarity, please feel free to substitute // your own favourite ultra-performance high-octance // string appender algorithm StringBuilder commaSeparated = new StringBuilder (); foreach (T value in values) { // PERF: store format string as const commaSeparated.AppendFormat ("{0}, ", value); } // PERF: store trim chars as static readonly array return commaSeparated.Trim (", ".ToCharArray ()); } } ... // elsewhere in code List myIdentifiers = new List { 1, 2, 3, 4, 5, }; string mySqlIdentifierList = myIdentifiers.ToCommaSeparatedList (); string mySqlStatementFormat = "SELECT * FROM [SomeTable] WHERE [Id] IN ({0})"; string mySqlStatement = string.format (mySqlStatementFormat, mySqlIdentifierList); ... 

 ///  /// Converts an array of integers into a string that may be used in a SQL IN expression. ///  /// The array to convert. /// A string representing the array as a parenthetical comma-delemited list. If the array /// is empty or missing, then "(null)" is returned. public static string ToSqlInList(int[] values) { if (values == null || values.Length == 0) return "(null)"; // In SQL the expression "IN (NULL)" is always false. return string.Concat("(", string.Join(",", Array.ConvertAll(values,x=>x.ToString())), ")"); } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1022850.html

(0)
上一篇 2022年1月7日
下一篇 2022年1月7日

精彩推荐