https://github.com/mynihongo/optional
Optional type and extensions
https://github.com/mynihongo/optional
optional
Last synced: 4 months ago
JSON representation
Optional type and extensions
- Host: GitHub
- URL: https://github.com/mynihongo/optional
- Owner: MyNihongo
- License: mit
- Created: 2021-03-09T19:32:42.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2023-12-11T00:41:37.000Z (about 2 years ago)
- Last Synced: 2025-09-24T03:39:27.859Z (5 months ago)
- Topics: optional
- Language: C#
- Homepage:
- Size: 83 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://www.nuget.org/packages/MyNihongo.Option/)
[](https://www.nuget.org/packages/MyNihongo.Option/)
A very simple implementation of the optional pattern with a few extension methods.
### Create an Optional<T>
```cs
// Explicitly
var optional = Optional.Of(123);
// Implicitly
Optional optional = 123;
// Extension method
var optional = 123.AsOptional();
// From Task/ValueTask
var optional = Task.FromResult(123).AsOptionalAsync();
var optional = new ValueTask(123).AsOptionalAsync();
// None
var none = Optional.None();
```
### Handle values of Optional<T>
```cs
var value = Optional.Of(123).ValueOr(321);
var convertOptional = Optional.Of(123).Convert(x => (long)x);
var convertValue = Optional.Of(123).ConvertOr(x => (long)x, 321L);
```
### Invoke functions if a value is present or not
Both synchronous (void) and asynchronous (Task and ValueTask) can be invoked.
```cs
Optional.Of(123)
.IfHasValue(x => { /* do something with the value */ })
.OrElse(() => { /* do something if no value */ });
await Optional.None()
.IfHasValueAsync(x => new ValueTask())
.OrElseAsync(() => new ValueTask());
```
### Create an Optional<T> from IEnumerable<T>
FirstOrOptional
```cs
var items = new [] { 1, 2, 3 };
var item = items.FirstOrOptional();
var item = items.FirstOrOptional(x => x % 2 == 0);
```
LastOrOptional
```cs
var items = new [] { 1, 2, 3 };
var item = items.LastOrOptional();
var item = items.LastOrOptional(x => x % 2 == 0);
```
SingleOrOptional
```cs
var items = new [] { 1, 2, 3 };
var item = items.SingleOrOptional();
var item = items.SingleOrOptional(x => x % 2 == 0);
```
ElementAtOrOptional
```cs
var items = new [] { 1, 2, 3 };
var item = items.SingleOrOptional(3);
```
MinOrOptional
```cs
var items = new [] { 1, 2, 3 };
var item = items.MinOrOptional();
```
```cs
var items = new []
{
new { Number = "1" },
new { Number = "2" }
};
var item = items.MinOrOptional(x => x.Number);
```
MaxOrOptional
```cs
var items = new [] { 1, 2, 3 };
var item = items.MaxOrOptional();
```
```cs
var items = new []
{
new { Number = "1" },
new { Number = "2" }
};
var item = items.MaxOrOptional(x => x.Number);
```