Skip to content

Commit 46e47a0

Browse files
committed
Enumerable.Range() usages improved
- use ToArray(count)/ToList(capacity) if possible - if used only for foreach replaced with regular for with index - replaced some of usages with CollectionUtils.RangeToXxx()
1 parent 646cb07 commit 46e47a0

6 files changed

Lines changed: 30 additions & 21 deletions

File tree

Orm/Xtensive.Orm.SqlServer/Sql.Drivers.SqlServer/ErrorMessageParser.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ public sealed class ErrorMessageParser
2323
private sealed class PreparedTemplate
2424
{
2525
public readonly Regex ParserExpression;
26-
public readonly ReadOnlyCollection<int> Indexes;
26+
public readonly IReadOnlyList<int> Indexes;
2727

28-
public PreparedTemplate(string regex, IEnumerable<int> indexes)
28+
public PreparedTemplate(string regex, IReadOnlyList<int> indexes)
2929
{
3030
ParserExpression = new Regex(regex, RegexOptions.Compiled | RegexOptions.CultureInvariant);
31-
Indexes = indexes.ToList().AsReadOnly();
31+
Indexes = indexes;
3232
}
3333
}
3434

@@ -190,7 +190,7 @@ private static PreparedTemplate PrepareEnglishTemplate(string template)
190190
}
191191

192192
CollectLastChunk(regexBuilder, template, offset);
193-
return new PreparedTemplate(regexBuilder.ToString(), Enumerable.Range(1, count));
193+
return new PreparedTemplate(regexBuilder.ToString(), Enumerable.Range(1, count).ToArray(count));
194194
}
195195

196196
private static PreparedTemplate PrepareNonEnglishTemplate(string template)
@@ -219,7 +219,7 @@ private static PreparedTemplate PrepareNonEnglishTemplate(string template)
219219
}
220220

221221
CollectLastChunk(regexBuilder, template, offset);
222-
return new PreparedTemplate(regexBuilder.ToString(), indexes);
222+
return new PreparedTemplate(regexBuilder.ToString(), indexes.ToArray());
223223
}
224224

225225

Orm/Xtensive.Orm/Orm/Building/Builders/IndexBuilder.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -809,16 +809,17 @@ private IEnumerable<ColumnInfo> GatherValueColumns(IEnumerable<ColumnInfo> colum
809809
private ColumnGroup BuildColumnGroup(IndexInfo index)
810810
{
811811
var reflectedType = index.ReflectedType;
812+
var indexKeyColumns = index.KeyColumns;
812813
var keyColumns = index.IsPrimary
813-
? Enumerable.Range(0, index.KeyColumns.Count).ToList()
814-
: index.KeyColumns
814+
? (IReadOnlyList<int>) CollectionUtils.RangeToArray(0, indexKeyColumns.Count)
815+
: indexKeyColumns
815816
.Select(pair => pair.Key)
816817
.Concat(index.ValueColumns)
817818
.Select((c, i) => new {c, i})
818819
.Where(arg => arg.c.IsPrimaryKey)
819820
.Select(arg => arg.i)
820821
.ToList();
821-
var columns = Enumerable.Range(0, index.KeyColumns.Count + index.ValueColumns.Count).ToList();
822+
var columns = CollectionUtils.RangeToArray(0, indexKeyColumns.Count + index.ValueColumns.Count);
822823
return new ColumnGroup(reflectedType, keyColumns, columns);
823824
}
824825

Orm/Xtensive.Orm/Orm/EntitySetBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -942,7 +942,7 @@ private static EntitySetTypeState BuildEntitySetTypeState(object key, EntitySetB
942942
.Where(ci => ci.IsPrimaryKey)
943943
.Select(ci => ci.Field.MappingInfo.Offset)
944944
.ToList()
945-
: Enumerable.Range(0, targetDescriptor.Count).ToList();
945+
: CollectionUtils.RangeToList(0, targetDescriptor.Count);
946946

947947
var keyFieldCount = ownerDescriptor.Count + itemColumnOffsets.Count;
948948
var keyFieldTypes = ownerDescriptor

Orm/Xtensive.Orm/Orm/Internals/Prefetch/EntityGroupTask.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,16 +171,18 @@ private QueryTask CreateQueryTask(List<Tuple> currentKeySet)
171171

172172
private static CompilableProvider CreateRecordSet(object cachingKey)
173173
{
174-
var pair = (Pair<object, CacheKey>) cachingKey;
175-
var selectedColumnIndexes = pair.Second.ColumnIndexes;
176-
var keyColumnsCount = pair.Second.Type.Indexes.PrimaryIndex.KeyColumns.Count;
174+
var cachedKey = ((Pair<object, CacheKey>) cachingKey).Second;
175+
var selectedColumnIndexes = cachedKey.ColumnIndexes;
176+
var primaryIndex = cachedKey.Type.Indexes.PrimaryIndex;
177+
var keyColumnsCount = primaryIndex.KeyColumns.Count;
178+
177179
var keyColumnIndexes = new int[keyColumnsCount];
178-
foreach (var index in Enumerable.Range(0, keyColumnsCount)) {
180+
for(var index = 0; index < keyColumnsCount; index++) {
179181
keyColumnIndexes[index] = index;
180182
}
181183

182-
var columnCollectionLength = pair.Second.Type.Indexes.PrimaryIndex.Columns.Count;
183-
return pair.Second.Type.Indexes.PrimaryIndex.GetQuery().Include(IncludeAlgorithm.ComplexCondition,
184+
var columnCollectionLength = primaryIndex.Columns.Count;
185+
return primaryIndex.GetQuery().Include(IncludeAlgorithm.ComplexCondition,
184186
true, context => context.GetValue(includeParameter), $"includeColumnName-{Guid.NewGuid()}",
185187
keyColumnIndexes).Filter(t => t.GetValue<bool>(columnCollectionLength)).Select(selectedColumnIndexes);
186188
}

Orm/Xtensive.Orm/Orm/Providers/TemporaryTables/TemporaryTableManager.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ namespace Xtensive.Orm.Providers
2222
public class TemporaryTableManager : DomainBoundHandler
2323
{
2424
private const string TableNamePattern = "Tmp_{0}";
25-
private const string ColumnNamePattern = "C{0}";
2625

2726
private TemporaryTableBackEnd backEnd;
2827

@@ -151,9 +150,13 @@ private void EnsureTemporaryTablesSupported()
151150

152151
private string[] BuildFieldNames(TupleDescriptor source)
153152
{
154-
return Enumerable.Range(0, source.Count)
155-
.Select(i => string.Format(ColumnNamePattern, i))
156-
.ToArray();
153+
var names = new string[source.Count];
154+
for(int i = 0, count = names.Length; i < count; i++) {
155+
#pragma warning disable IDE0071 // Simplify interpolation
156+
names[i] = $"C{i.ToString("G")}";
157+
#pragma warning restore IDE0071 // Simplify interpolation
158+
}
159+
return names;
157160
}
158161

159162
private Table CreateTemporaryTable(Schema schema, string name, TupleDescriptor source, TypeMapping[] typeMappings, string[]fieldNames, Collation collation)

Orm/Xtensive.Orm/Orm/Rse/Transformation/Internals/SkipTakeRewriter.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Xtensive.Core;
1111
using Xtensive.Orm.Rse.Providers;
1212
using Xtensive.Orm;
13+
using Xtensive.Collections;
1314

1415
namespace Xtensive.Orm.Rse.Transformation
1516
{
@@ -52,10 +53,12 @@ protected override Provider Visit(CompilableProvider cp)
5253
visitedProvider = new SkipProvider(visitedProvider, State.Skip);
5354

5455
// add select removing RowNumber column
55-
if (requiresRowNumber)
56+
if (requiresRowNumber) {
57+
var headerCount = visitedProvider.Header.Length - 1;
5658
visitedProvider = new SelectProvider(
5759
visitedProvider,
58-
Enumerable.Range(0, visitedProvider.Header.Length - 1).ToArray());
60+
CollectionUtils.RangeToArray(0, headerCount));
61+
}
5962

6063
return visitedProvider;
6164
}

0 commit comments

Comments
 (0)