Нужна помощь в превращении этого метода (используя string.Join () и LINQ) в общий - PullRequest
2 голосов
/ 18 апреля 2019

Я написал функцию, которая преобразует значения DataTable в строку, отформатированную как «значение1, значение2, значение3, ...». Функция также принимает в качестве аргумента columnindex и surrounder (обычно "'").

Вместо того, чтобы писать множество различных вариантов этой функции (например, одну с набором данных, другую со списком и т. Д.), Я бы хотел сделать только одну функцию для этой функции, которая является общей.

Я уже пытался добавить и IEnumerable к заголовку функции, но затем получил ошибку «Невозможно применить индексирование с помощью [] к выражению типа« T »» внутри функции.

Я думаю, мне нужно сделать интерфейс, чтобы это работало (?), Но у меня нет особого опыта.

Это оригинальная функция, которую я хочу превратить в общую:

public static string GenerateWhereInListFromData(DataTable dt_data, int columnIndex, string separator)
{
    string resultList = string.Join(", ", dt_data.AsEnumerable().Select(tmp => separator + tmp[columnIndex].ToString() + separator));

    return resultList;
}

Может ли кто-нибудь помочь с тем, как превратить это в универсальную функцию, которая может принимать набор данных, массив данных, массив строк, список и, возможно, другие вещи в качестве входного параметра?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Чтобы универсальная функция работала, вам нужно найти интерфейс, который работает для всех передаваемых типов, таких как iList, ICollection, IEnumerable и т. Д. Если вы не можете найти интерфейс для всего этого, попробуйте проверить объект.введите для всех этих интерфейсов и иметь код, который будет копировать данные в список, который вы затем присоединитесь.

1 голос
/ 18 апреля 2019

короткое объяснение:

Может быть, ваш метод, который терпит неудачу, выглядит следующим образом:

public static string GenerateWhereInListFromDataFail<T>(IEnumerable<T> dt_data, int columnIndex, string separator) 
        {
            return string.Join(", ", dt_data.Select(tmp => separator + tmp[columnIndex].ToString() + separator));;
        }

Итак, проблема в том, что у вас есть метод доступа к столбцу.Одним из решений проблемы может быть делегирование работы.

public static string GenerateWhereInListFromData<T>(IEnumerable<T> dt_data, Func<T, string> columnAccessor, string separator) 
    {
        return string.Join(", ", dt_data.Select(tmp => separator + columnAccessor(tmp) + separator));;
    }

Вызов метода выглядит следующим образом:

GenerateWhereInListFromData(new List<System.Data.DataRow>(), t => t[0].ToString(), ",");

Я надеюсь, что смогу вам помочь.

Отредактированная часть:


Чтобы ответить на вопрос в вашем комментарии.Вам не нужно определять некоторые другие методы для взаимодействия с различными типами.Вам просто нужно убедиться, что вы можете работать со всеми, как IEnumerable.

Может быть, какой-то код может объяснить то, что я пытаюсь сказать:

System.Data.DataSet dataSet = null;
var result = GenerateWhereInListFromData(dataSet.Tables.Cast<System.Data.DataTable>(), t => t.TableName, ",");

System.Data.DataTable dataTable = null;
result = GenerateWhereInListFromData(dataTable.Rows.Cast<System.Data.DataRow>(), t => t["SomeColumn"].ToString(), ",");
result = GenerateWhereInListFromData(dataTable.Columns.Cast<System.Data.DataColumn>(), t => t.ColumnName, ",");

Метод extention.Cast () делает работу оченьЧто ж.Он приводит все внутренние объекты к некоторому IEnumerable.

Таким образом, результаты могут выглядеть следующим образом:

Table1, Table2, Table3,

Value1, Value2, Value3,

Столбец1, Столбец2, Столбец3,

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