Фильтровать строковый массив из строкового массива в объекте - PullRequest
1 голос
/ 15 апреля 2020

У меня есть массив строк: string[] sourceDestinationValue. Есть еще один объект: XRefResponse mappedValuesResponse. Свойства объекта упомянуты ниже:

    public string[] SourceValuesField;

    public string[] MappedValuesField;

    public bool AllValuesMappedField;

    public string[] CommentField;

Я хочу отфильтровать свойство SourceValuesField класса XRefResponse на основе sourceDestinationValue и вернуть массив свойства MappedValuesField для сопоставленных значений, используя Linq.

I пробовал это:

var result = sourceDestinationValue.Where(x => mappedValuesResponse.SourceValues.Any(s => s.Contains(x))).ToArray();

1 Ответ

1 голос
/ 15 апреля 2020

Если я правильно понял, у вас есть такой класс:

class XRefResponse
{
    public string[] SourceValuesField;
    public string[] MappedValuesField;
    public bool AllValuesMappedField;
    public string[] CommentField;
}

И такая переменная:

XRefResponse mappedValuesResponse

Вы хотите использовать Linq (я не чтобы увидеть все специализированные коды EntityFramework в вашем примере), чтобы получить все значения MappedValuesField, позиции которых соответствуют значениям SourceValuesField, которые находятся в данном массиве.

Исходя из этого, я предполагаю, что SourceValuesField и MappedValuesField являются ненулевыми и имеют одинаковую длину.

Тогда возможное решение может быть:

string[] Filter(XRefResponse mappedValuesResponse, string[] sourceDestinationValue)
    {
        var allPairs = mappedValuesResponse.SourceValuesField.Zip(mappedValuesResponse.MappedValuesField, (source, mapped) => new { Source = source, Mapped = mapped });
        var matchedPairs = allPairs.Where(pair => Array.IndexOf(sourceDestinationValue, pair.Source) >= 0);
        var result = matchedPairs.Select(pair => pair.Mapped);
        return result.ToArray();
    }

Этот метод выполняет следующие действия:

  1. Создает последовательность пар из значений SourceValueField и MappedValuesField (см. Метод Zip ).
  2. Фильтрует все пары, для которых поле Source соответствует любому из sourceDestinationValue values.
  3. Возвращает новую последовательность, которая содержит только значения Mapped из предыдущего шага.

Локальные переменные помогают понять код и разделить подоперации, но вы можете удалите их, если хотите.

В случае SourceValueField и MappedValuesField всегда обрабатываются парами, лучшей реализацией может быть наличие одного массива, содержащего значения из обоих полей (возможно, с использованием кортежей, например: public Tuple<string,string>[] ValuesField;), или словарь, в котором ключи соответствуют SourceValueField и значения соответствуют MappedValuesField (например: public Dictionary<string,string> ValuesField;).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...