mirror of
https://github.com/ICDSystems/ICD.Common.Utils.git
synced 2026-02-16 21:24:58 +00:00
feat: add TryParseSkipFailures extension
This commit is contained in:
@@ -1057,6 +1057,40 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// since S# can't do anonymous types
|
||||||
|
private struct TryParseStruct<T>
|
||||||
|
{
|
||||||
|
public readonly T value;
|
||||||
|
public readonly bool isParsed;
|
||||||
|
public TryParseStruct(T value, bool isParsed)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
this.isParsed = isParsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// since Func<...,T> can't specify `out` parameters
|
||||||
|
public delegate bool TryParseDelegate<T>(string input, out T output);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to parse each value of the enumerable,
|
||||||
|
/// throwing away the values that don't parse correctly.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">type to parse to</typeparam>
|
||||||
|
/// <param name="extends">enumerable of strings to parse</param>
|
||||||
|
/// <param name="tryParseFunc">TryParse function for given type</param>
|
||||||
|
/// <returns>enumerable of successfully parsed values</returns>
|
||||||
|
public static IEnumerable<T> TryParseSkipFailures<T>(this IEnumerable<string> extends, TryParseDelegate<T> tryParseFunc)
|
||||||
|
{
|
||||||
|
return extends.Select(str =>
|
||||||
|
{
|
||||||
|
T value = default(T);
|
||||||
|
bool isParsed = tryParseFunc(str, out value);
|
||||||
|
return new TryParseStruct<T>(value, isParsed);
|
||||||
|
})
|
||||||
|
.Where(v => v.isParsed == true)
|
||||||
|
.Select(v => v.value);
|
||||||
|
}
|
||||||
|
|
||||||
#if SIMPLSHARP
|
#if SIMPLSHARP
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1093,5 +1127,5 @@ namespace ICD.Common.Utils.Extensions
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user