Как вернуть типизированный кортеж в зависимости от того, какая переменная не является нулевой? - PullRequest
0 голосов
/ 28 февраля 2019

Как мы можем реализовать сопоставление с образцом для возврата кортежа?

В настоящее время подпись метода

public static string Match(string nodeName, string nodeValue, string sourceParty, 
    string destinationParty, List<Translation> translations)

ЖелаемыйПодпись метода

public static (string, TypeOfMatch) Match(string nodeName, string nodeValue, 
    string sourceParty, string destinationParty, List<Translation> translations)

У меня есть следующий статический метод:

public static class Matcher
{
    public static string Match(string nodeName, string nodeValue, string sourceParty, 
        string destinationParty, List<Translation> translations)
    {
        //please excuse the pseudo code in these 3 lines
        var exactMatch = from.translations(where xyz).select.Take(1)
        var defaultMatch = from.translations.select(where abc).Take(1)
        var anySourceMatch = from.translations.select(where sss).Take(1)

        return exactMatch.FirstOrDefault() ??
            defaultMatch.FirstOrDefault() ??
            anySourceMatch.FirstOrDefault() ??
            nodeValue;
    }
}

Я хотел бы знать type соответствия, которое было возвращено (было ли оно точным /default / anySource).

Сейчас мы возвращаем string, но, возможно, возвращение должно быть кортежем, таким как (TypeOfMatch, string), где TypeOfMatch будет перечислением, таким как:

public enum TypeOfMatch
{
    Exact, Default, AnySource
}

но тогда наш оператор возврата будет выглядеть примерно так:

if (exactMatch.FirstOrDefault() != null)
    return (TypeOfMatch.Exact, exactMatch.First());

if (defaultMatch.FirstOrDefault() != null)
    return (TypeOfMatch.Default, defaultMatch.First());

// etc.

Есть ли более надежный способ сделать switch, для которой переменная не была нулевой, и затем вернуть пару(TypeOfMatch, string)

1 Ответ

0 голосов
/ 28 февраля 2019

Проблема в вашем сценарии заключается в том, что кортежи значений являются типами значений и поэтому не могут быть объединены с помощью оператора null-coalescing , ??, который работает только с обнуляемыми типами.Однако вы можете определить метод расширения, чтобы преобразовать ваш кортеж значения в тип значения nullable , который затем может быть подвергнут ??.

Я предполагаю, что ваш класс Translationимеет неявное преобразование типов в string;в противном случае вам нужно вызвать ToString() или прочитать строковое свойство при построении ваших значений.

public static class Matcher
{
    public static (TypeOfMatch, string) Match(
        string nodeName, string nodeValue, string sourceParty,
        string destinationParty, List<Translation> translations)
    {
        return
            translations.Where(xyz).Select(t => (TypeOfMatch.Exact, t)).FirstOrNull() ??
            translations.Where(abc).Select(t => (TypeOfMatch.Default, t)).FirstOrNull() ??
            translations.Where(sss).Select(t => (TypeOfMatch.AnySource, t)).FirstOrNull() ??
            (TypeOfMatch.NodeValue, nodeValue);
    }
}

public static class EnumerableExtensions
{
    public static T? FirstOrNull<T>(this IEnumerable<T> source)
        where T : struct
    {
        return source.Cast<T?>().FirstOrDefault();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...