Если вы знаете, что элементы всегда хешируются, вы можете использовать Counter()
, который является O (n). Если вы знаете, что элементы всегда сортируемы, вы можете использовать sorted()
, который является O (n log n)
В общем случае вы не можете полагаться на возможность сортировки или наличия элементов, поэтому вам нужен такой резерв, который, к сожалению, O (n ^ 2)
len(a)==len(b) and all(a.count(i)==b.count(i) for i in a)
Глава LINQ to DataSets в LINQ in Action - это хорошее прочтение.
Одна вещь, которую вы увидите, это метод расширения Поле
, который используется следующим образом: -
int? x = dr.Field<int?>( "Field" );
Или
int y = dr.Field<int?>( "Field" ) ?? 0;
Или
var z = dr.Field<int?>( "Field" );
Это назначение класса DataRowExtensions
в .NET 3.5, который предоставляет статическое поле
и SetField
методы для двустороннего переключения обнуляемых (и не обнуляемых) данных между типами DataRow
и .NET.
int? fld = row.Field<int?>("ColumnA")
установит fld
в null
if row ["ColumnA"]
содержит DBNull.Value
, к его значению, если оно содержит целое число, и генерировать исключение, если оно содержит что-либо еще. На обратном пути
row.SetField("ColumnA", fld);
делает то же самое в обратном порядке: если fld
содержит null
, он устанавливает row ["ColumnA"]
в ] DBNull.Value
, а в противном случае устанавливает значение fld
.
Почему бы не использовать LINQ? Он делает преобразование за вас.
Методы расширения!
Что-то вроде следующего:
public static class DataRowExtensions
{
public static Nullable<T> GetNullableValue<T>(this DataRow row, string columnName)
where T : struct
{
object value = row[columnName];
if (Convert.IsDBNull(value))
return null;
return (Nullable<T>)value;
}
public static T GetValue<T>(this DataRow row, string columnName)
where T : class
{
object value = row[columnName];
if (Convert.IsDBNull(value))
return null;
return (T)value;
}
}
Используйте это так:
int? a = dr.GetNullableValue<int>("A");
или
string b = dr.GetValue<string>("B");
Следующее будет работать, безопасно:
Snip:
public static class SqlDataReaderEx
{
public static int TryParse(SqlDataReader drReader, string strColumn, int nDefault)
{
int nOrdinal = drReader.GetOrdinal(strColumn);
if (!drReader.IsDbNull(nOrdinal))
return drReader.GetInt32(nOrdinal);
else
return nDefault;
}
}
Использование:
SqlDataReaderEx.TryParse(drReader, "MyColumnName", -1);