#### [Abblix\.Utils](https://www.abblix.com/en/docs/api/abblix-utils 'index')
### [Abblix\.Utils](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils 'Abblix\.Utils')

## EnumerableExtensions Class

Provides extension methods for IEnumerable\<T\> for common operations\.

```csharp
public static class EnumerableExtensions
```

Inheritance [System\.Object](https://learn.microsoft.com/en-us/dotnet/api/system.object 'System\.Object') → EnumerableExtensions
### Methods

## EnumerableExtensions\.EnqueueAll\<T\>\(this Queue\<T\>, IEnumerable\<T\>\) Method {#Abblix.Utils.EnumerableExtensions.EnqueueAll_T_(thisSystem.Collections.Generic.Queue_T_,System.Collections.Generic.IEnumerable_T_)}

Enqueues all elements from a specified collection into the given queue\.

```csharp
public static void EnqueueAll<T>(this System.Collections.Generic.Queue<T> queue, System.Collections.Generic.IEnumerable<T>? input);
```
#### Type parameters

###### `T` {#Abblix.Utils.EnumerableExtensions.EnqueueAll_T_(thisSystem.Collections.Generic.Queue_T_,System.Collections.Generic.IEnumerable_T_).T}

The type of elements contained in the queue and the enumerable collection\.
#### Parameters

###### `queue` [System\.Collections\.Generic\.Queue&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1 'System\.Collections\.Generic\.Queue\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.EnqueueAll_T_(thisSystem.Collections.Generic.Queue_T_,System.Collections.Generic.IEnumerable_T_).T 'Abblix\.Utils\.EnumerableExtensions\.EnqueueAll\<T\>\(this System\.Collections\.Generic\.Queue\<T\>, System\.Collections\.Generic\.IEnumerable\<T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1 'System\.Collections\.Generic\.Queue\`1') {#Abblix.Utils.EnumerableExtensions.EnqueueAll_T_(thisSystem.Collections.Generic.Queue_T_,System.Collections.Generic.IEnumerable_T_).queue}

The queue into which elements will be enqueued\.

###### `input` [System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.EnqueueAll_T_(thisSystem.Collections.Generic.Queue_T_,System.Collections.Generic.IEnumerable_T_).T 'Abblix\.Utils\.EnumerableExtensions\.EnqueueAll\<T\>\(this System\.Collections\.Generic\.Queue\<T\>, System\.Collections\.Generic\.IEnumerable\<T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1') {#Abblix.Utils.EnumerableExtensions.EnqueueAll_T_(thisSystem.Collections.Generic.Queue_T_,System.Collections.Generic.IEnumerable_T_).input}

The collection of elements to enqueue\. If the collection is null, no action is taken\.

## EnumerableExtensions\.FirstOrDefaultAsync\<TSource,TResult\>\(this IEnumerable\<TSource\>, Func\<TSource,Task\<TResult\>\>\) Method {#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__)}

Projects each element of [source](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).source 'Abblix\.Utils\.EnumerableExtensions\.FirstOrDefaultAsync\<TSource,TResult\>\(this System\.Collections\.Generic\.IEnumerable\<TSource\>, System\.Func\<TSource,System\.Threading\.Tasks\.Task\<TResult\>\>\)\.source') through an async
[selector](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).selector 'Abblix\.Utils\.EnumerableExtensions\.FirstOrDefaultAsync\<TSource,TResult\>\(this System\.Collections\.Generic\.IEnumerable\<TSource\>, System\.Func\<TSource,System\.Threading\.Tasks\.Task\<TResult\>\>\)\.selector') and returns the first non\-null projection, or `null`
when every projection is null\. Short\-circuits at the first non\-null result \-\- subsequent
elements are not awaited\.

```csharp
public static System.Threading.Tasks.Task<TResult?> FirstOrDefaultAsync<TSource,TResult>(this System.Collections.Generic.IEnumerable<TSource> source, System.Func<TSource,System.Threading.Tasks.Task<TResult?>> selector)
    where TResult : class;
```
#### Type parameters

###### `TSource` {#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).TSource}

The element type of the sequence\.

###### `TResult` {#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).TResult}

The projection result type; constrained to reference so
            "no result" can be expressed as `null`\.
#### Parameters

###### `source` [System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[TSource](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).TSource 'Abblix\.Utils\.EnumerableExtensions\.FirstOrDefaultAsync\<TSource,TResult\>\(this System\.Collections\.Generic\.IEnumerable\<TSource\>, System\.Func\<TSource,System\.Threading\.Tasks\.Task\<TResult\>\>\)\.TSource')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1') {#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).source}

The sequence of items to iterate\.

###### `selector` [System\.Func&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[TSource](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).TSource 'Abblix\.Utils\.EnumerableExtensions\.FirstOrDefaultAsync\<TSource,TResult\>\(this System\.Collections\.Generic\.IEnumerable\<TSource\>, System\.Func\<TSource,System\.Threading\.Tasks\.Task\<TResult\>\>\)\.TSource')[,](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[System\.Threading\.Tasks\.Task&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[TResult](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).TResult 'Abblix\.Utils\.EnumerableExtensions\.FirstOrDefaultAsync\<TSource,TResult\>\(this System\.Collections\.Generic\.IEnumerable\<TSource\>, System\.Func\<TSource,System\.Threading\.Tasks\.Task\<TResult\>\>\)\.TResult')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2') {#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).selector}

Async projection invoked per element until one returns non\-null\.

#### Returns
[System\.Threading\.Tasks\.Task&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')[TResult](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FirstOrDefaultAsync_TSource,TResult_(thisSystem.Collections.Generic.IEnumerable_TSource_,System.Func_TSource,System.Threading.Tasks.Task_TResult__).TResult 'Abblix\.Utils\.EnumerableExtensions\.FirstOrDefaultAsync\<TSource,TResult\>\(this System\.Collections\.Generic\.IEnumerable\<TSource\>, System\.Func\<TSource,System\.Threading\.Tasks\.Task\<TResult\>\>\)\.TResult')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.task-1 'System\.Threading\.Tasks\.Task\`1')  
The first non\-null projection, or `null` when none produced a value\.

### Remarks
Designed for short\-circuiting pipelines where each step returns either a payload \(e\.g\.
an error object\) or `null` meaning "passed; keep going"\.

## EnumerableExtensions\.FlattenTree\<T\>\(this IEnumerable\<T\>, Func\<T,IEnumerable\<T\>\>\) Method {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__)}

Flattens a tree structure into a flat sequence using breadth\-first traversal\.

```csharp
public static System.Collections.Generic.IEnumerable<T> FlattenTree<T>(this System.Collections.Generic.IEnumerable<T>? input, System.Func<T,System.Collections.Generic.IEnumerable<T>> childrenSelector);
```
#### Type parameters

###### `T` {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__).T}

The type of elements in the tree\.
#### Parameters

###### `input` [System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1') {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__).input}

The sequence of root elements\.

###### `childrenSelector` [System\.Func&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T')[,](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2') {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__).childrenSelector}

A function to retrieve the children of an element\.

#### Returns
[System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisSystem.Collections.Generic.IEnumerable_T_,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')  
A flattened sequence of all elements in the tree\.

## EnumerableExtensions\.FlattenTree\<T\>\(this T, Func\<T,IEnumerable\<T\>\>\) Method {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__)}

Flattens a tree structure starting from a single root element into a flat sequence using breadth\-first traversal\.

```csharp
public static System.Collections.Generic.IEnumerable<T> FlattenTree<T>(this T root, System.Func<T,System.Collections.Generic.IEnumerable<T>> childrenSelector);
```
#### Type parameters

###### `T` {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__).T}

The type of elements in the tree\.
#### Parameters

###### `root` [T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this T, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T') {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__).root}

The root element of the tree\.

###### `childrenSelector` [System\.Func&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this T, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T')[,](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this T, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2') {#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__).childrenSelector}

A function to retrieve the children of an element\.

#### Returns
[System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.FlattenTree_T_(thisT,System.Func_T,System.Collections.Generic.IEnumerable_T__).T 'Abblix\.Utils\.EnumerableExtensions\.FlattenTree\<T\>\(this T, System\.Func\<T,System\.Collections\.Generic\.IEnumerable\<T\>\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')  
A flattened sequence of all elements in the tree\.

## EnumerableExtensions\.Materialize\<T\>\(this IEnumerable\<T\>\) Method {#Abblix.Utils.EnumerableExtensions.Materialize_T_(thisSystem.Collections.Generic.IEnumerable_T_)}

Forces a sequence to be evaluated once and returns the result as a non\-lazy
[System\.Collections\.Generic\.IReadOnlyCollection&lt;&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlycollection-1 'System\.Collections\.Generic\.IReadOnlyCollection\`1') that callers can iterate any number of times\.
Use at any site that needs to enumerate the same [System\.Collections\.Generic\.IEnumerable&lt;&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1') more than once
\(cost estimate \+ actual call, log \+ record, etc\.\) \- a lazy LINQ pipeline or an iterator
method passed by an upstream caller would otherwise re\-execute its source per enumeration\.

```csharp
public static System.Collections.Generic.IReadOnlyCollection<T> Materialize<T>(this System.Collections.Generic.IEnumerable<T> source);
```
#### Type parameters

###### `T` {#Abblix.Utils.EnumerableExtensions.Materialize_T_(thisSystem.Collections.Generic.IEnumerable_T_).T}

The type of elements in the sequence\.
#### Parameters

###### `source` [System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.Materialize_T_(thisSystem.Collections.Generic.IEnumerable_T_).T 'Abblix\.Utils\.EnumerableExtensions\.Materialize\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1') {#Abblix.Utils.EnumerableExtensions.Materialize_T_(thisSystem.Collections.Generic.IEnumerable_T_).source}

The sequence to materialize\.

#### Returns
[System\.Collections\.Generic\.IReadOnlyCollection&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlycollection-1 'System\.Collections\.Generic\.IReadOnlyCollection\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.Materialize_T_(thisSystem.Collections.Generic.IEnumerable_T_).T 'Abblix\.Utils\.EnumerableExtensions\.Materialize\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ireadonlycollection-1 'System\.Collections\.Generic\.IReadOnlyCollection\`1')  
A non\-lazy collection holding all elements of [source](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.Materialize_T_(thisSystem.Collections.Generic.IEnumerable_T_).source 'Abblix\.Utils\.EnumerableExtensions\.Materialize\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>\)\.source')\.

### Remarks
Skips the allocation when [source](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.Materialize_T_(thisSystem.Collections.Generic.IEnumerable_T_).source 'Abblix\.Utils\.EnumerableExtensions\.Materialize\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>\)\.source') is already a concrete collection
\(`T[]`, `List<T>`, `HashSet<T>`, etc\.\) \- only lazy /
iterator\-method sources pay for a one\-shot copy\.

## EnumerableExtensions\.OrEmpty\<T\>\(this IEnumerable\<T\>\) Method {#Abblix.Utils.EnumerableExtensions.OrEmpty_T_(thisSystem.Collections.Generic.IEnumerable_T_)}

Returns the original sequence, or an empty sequence if the original is null\.

```csharp
public static System.Collections.Generic.IEnumerable<T> OrEmpty<T>(this System.Collections.Generic.IEnumerable<T>? value);
```
#### Type parameters

###### `T` {#Abblix.Utils.EnumerableExtensions.OrEmpty_T_(thisSystem.Collections.Generic.IEnumerable_T_).T}

The type of elements in the sequence\.
#### Parameters

###### `value` [System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.OrEmpty_T_(thisSystem.Collections.Generic.IEnumerable_T_).T 'Abblix\.Utils\.EnumerableExtensions\.OrEmpty\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1') {#Abblix.Utils.EnumerableExtensions.OrEmpty_T_(thisSystem.Collections.Generic.IEnumerable_T_).value}

The sequence to return or an empty sequence if this is null\.

#### Returns
[System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.OrEmpty_T_(thisSystem.Collections.Generic.IEnumerable_T_).T 'Abblix\.Utils\.EnumerableExtensions\.OrEmpty\<T\>\(this System\.Collections\.Generic\.IEnumerable\<T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')  
The original sequence or an empty sequence\.

## EnumerableExtensions\.TravelUp\<T\>\(this T, Func\<T,T\>\) Method {#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_)}

Traverses a hierarchy upwards, starting from a specific item and moving to its parent, grandparent, etc\.,
as determined by a parent selector function\.

```csharp
public static System.Collections.Generic.IEnumerable<T> TravelUp<T>(this T item, System.Func<T,T?> parentSelector)
    where T : class;
```
#### Type parameters

###### `T` {#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_).T}

The type of elements in the hierarchy\.
#### Parameters

###### `item` [T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_).T 'Abblix\.Utils\.EnumerableExtensions\.TravelUp\<T\>\(this T, System\.Func\<T,T\>\)\.T') {#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_).item}

The starting item in the hierarchy\.

###### `parentSelector` [System\.Func&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_).T 'Abblix\.Utils\.EnumerableExtensions\.TravelUp\<T\>\(this T, System\.Func\<T,T\>\)\.T')[,](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_).T 'Abblix\.Utils\.EnumerableExtensions\.TravelUp\<T\>\(this T, System\.Func\<T,T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.func-2 'System\.Func\`2') {#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_).parentSelector}

A function that returns the parent of a given item\.

#### Returns
[System\.Collections\.Generic\.IEnumerable&lt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')[T](https://www.abblix.com/en/docs/api/abblix-utils/Abblix.Utils.EnumerableExtensions#Abblix.Utils.EnumerableExtensions.TravelUp_T_(thisT,System.Func_T,T_).T 'Abblix\.Utils\.EnumerableExtensions\.TravelUp\<T\>\(this T, System\.Func\<T,T\>\)\.T')[&gt;](https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.ienumerable-1 'System\.Collections\.Generic\.IEnumerable\`1')  
An IEnumerable\<T\> representing the path from the item upwards in the hierarchy\.
