Обновление:
После прочтения комментария ОП я вижу, что он хочет иметь возможность использовать шестнадцатеричные строки произвольной длины.Я хотел бы использовать функцию итератора, чтобы вернуть ваши шестнадцатеричные пары, чтобы соответствовать результату вашего разделения.Затем вы можете передать любое из перечисляемых значений через одно и то же преобразование, например, так:
public byte[] ConvertToByteArray(string s)
{
IEnumerable<string> query = Enumerable.Empty<string>();
if (s.StartsWith("0x"))
{
query = IterateHexPairs(s.Substring(2));
}
else
{
query = s.Split('-');
}
return query.Select(b => Convert.ToByte(b, 16)).ToArray();
IEnumerable<string> IterateHexPairs(string hexLiteral)
{
char? previousNibble = null;
foreach (var nibble in hexLiteral)
{
if (previousNibble != null)
{
yield return new string(new char[] { previousNibble.Value, nibble });
previousNibble = null;
}
else
{
previousNibble = nibble;
}
}
}
}
Это позволяет избежать дублирования логики преобразования, поскольку оба они получают от IEnumerable.Единственная разница - источник IEnumerable.Измените код, который дает вам перечислимый, как вы считаете нужным.Я думал, что функция Iterator будет более удобной в обслуживании, но вы можете выполнить запрос Linq для достижения того же результата, например:
public byte[] ConvertToByteArray(string s)
{
IEnumerable<string> query = Enumerable.Empty<string>();
if (s.StartsWith("0x"))
{
// omit the 0x
query = s.Skip(2)
// get the char and index, so we can pair them up
.Select((c, i) => new { Char = c, Index = i })
// group them into pairs
.GroupBy(o => o.Index / 2)
// select them as new strings, so they can be converted
.Select(g => new string(g.Select(o => o.Char).ToArray()));
}
else
{
query = s.Split('-');
}
return query.Select(b => Convert.ToByte(b, 16)).ToArray();
}