Performance Tips (edit)

C#.NET Tutorials For Beginners and Professionals - Dot Net Tutorials

  • Enums
  • Strings
  • Arrays
  • Lists
  • Interfaces
  • Switch Statements
  • Operators

5) Contains method in HashSet<T> and List<T>

HashSet<T> Class (System.Collections.Generic) | Microsoft Docs

List<T> Class (System.Collections.Generic) | Microsoft Docs

Sourcec# - Performance Benchmarking of Contains, Exists and Any - Stack Overflow

  • HashSet<T>.Contains :     0 ms (10000 items)
  • List<T>.Contains        : 569 ms (10000 items)

image

Source: theburningmonk/HashSet-vs-List-vs-Dictionary: Simple performance test of HashSet<T> vs List<T> and Dictionary<TKey, TValue> (github.com)

How to use HashSet in C# | InfoWorld

HashSet vs List vs Dictionary | theburningmonk.com

So sánh tốc độ List collection và HashSet collection trong C# - Tungnt.net

4) String

  • Sử dụng StringBuilder với những đoạn code cộng chuỗi cho n (n > 3) phép cộng chuỗi sẽ tốt hơn dùng toán tử cộng chuỗi.
  • Sử dụng toán tử "+" chuỗi khi có tổng cộng n (n <= 3) phép cộng chuỗi.
  • Thử với String.Concat
  • Thử với String.Join(";", array);
  • Thử với String.Format
  • Thử với String interpolation: @$"{}"

3/ Integer

  • Sử dụng Int32.TryParse sẽ tốt hơn Int32.Parse

Not Good

numVal = Int32.Parse("-105")

Good

if (Int32.TryParse("-105", out int j)) // Does not throw exception

2/ Dictionary

Nếu bạn đang cố gắng lấy ra giá trị từ từ điển, thì TryGetValue (khóa, giá trị ngoài) là lựa chọn tốt nhất, nhưng nếu bạn đang kiểm tra sự hiện diện của khóa, để chèn mới, không ghi đè các khóa cũ, ContainsKey (khóa) là tùy chọn tốt nhất.

  • Sử dụng Dictionary.TryGetValue() sẽ tốt hơn Dictionary.ContainsKey() trong trường hợp cố gắng lấy ra giá trị từ từ điển.
  • Sử dụng Dictionary.ContainsKey() sẽ tốt hơn Dictionary.TryGetValue() trong trường hợp kiểm tra trùng lặp khóa để thêm phần tử vào Dictionary.

Usage:

if (counts.ContainsKey("key"))
if (counts.TryGetValue("key", out T value)) // Does not throw exception

1/ DataReader

  • Sử dụng DataReader.GetSchemaTable khi cần lấy tên cột và kiểu dữ liệu trả về.
    • DataTable schemaTable = reader.GetSchemaTable();
    • var colNames = schemaTable.Rows.Cast<DataRow>().Select(row => row["ColumnName"] as string).ToArray();
    • var colDataTypes = schemaTable.Rows.Cast<DataRow>().Select(row => (row["DataType"] as Type).Name).ToArray();
  • Sử dụng DataReader.InitialLOBFetchSize = -1 (đối với query có chứa trường LOB) sẽ tốt hơn với các trường LOB và dữ liệu trả về cho mỗi LOB gần giống nhau.
  • Sử dụng DataColumn.Ordinal (column ordinal) nhanh hơn dùng DataColumn.ColumnName (column name): faster using column ordinals instead of column names.

Đọc trường LOBs (BLOBs, CLOBs, and NCLOBs)

using (var conn = new OracleConnection(OracleConnString))
{
conn.Open();

using (var cmd = new OracleCommand(sql, conn))
{
var param = cmd.CreateParameter();
param.ParameterName = ":p__linq__0";
param.Value = 4879975843;
param.DbType = DbType.Int64;
cmd.Parameters.Add(param);

cmd.InitialLOBFetchSize = -1;
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
if (colNames.Contains("ORDER_CODE") && !reader.IsDBNull("ORDER_CODE"))
{
dto.ORDER_CODE = reader.GetValueOrDefault<String>("ORDER_CODE");
}
...

Kiểm tra ExistColumn

DataTable schemaTable = reader.GetSchemaTable();
string[] colNames = schemaTable.Rows.Cast<DataRow>().Select(row => row["ColumnName"] as string).ToArray();
string[] colDataTypes = schemaTable.Rows.Cast<DataRow>().Select(row => (row["DataType"] as Type).Name).ToArray();
if (colNames.Contains("ORDER_CODE") && !reader.IsDBNull("ORDER_CODE"))
{
dto.ORDER_CODE = reader.GetValueOrDefault<String>("ORDER_CODE");
}

Lấy giá trị khi đọc DataReader

public static class DataReaderExtension
{
public static bool IsDBNull(this IDataReader dataReader, string columnName)
{
return dataReader[columnName] == DBNull.Value;
}

public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
{
int ordinal = row.GetOrdinal(fieldName);
return row.GetValueOrDefault<T>(ordinal);
}

public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
{
return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
}
}

References

Const vs Static vs Readonly in C# (exceptionnotfound.net)

Retrieving Data Using a DataReader - Samir Daoudi's Technical Blog (daoudisamir.com)

Create a Windows Service in C# or Convert your Console App to a Service - Samir Daoudi's Technical Blog (daoudisamir.com)

Run part of your C# Code under a different user - Samir Daoudi's Technical Blog (daoudisamir.com)

C#, Authenticate against AD - Samir Daoudi's Technical Blog (daoudisamir.com)

Modal PoP Up in SharePoint using BootStrap - Samir Daoudi's Technical Blog (daoudisamir.com)