Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助将此方法(使用string.Join()和LINQ)转换为通用方法吗_C#_String_Linq_Generics_Join - Fatal编程技术网

C# 需要帮助将此方法(使用string.Join()和LINQ)转换为通用方法吗

C# 需要帮助将此方法(使用string.Join()和LINQ)转换为通用方法吗,c#,string,linq,generics,join,C#,String,Linq,Generics,Join,我编写了一个函数,将数据表的值转换为格式为“value1,value2,value3,…”的字符串。该函数还接受columnindex和一个包围符(通常为“'))作为参数 我不想为这个函数编写很多不同的变体(例如,一个带有数据集,一个带有列表等等),我只想为它创建一个通用函数 我已经尝试将和IEnumerable添加到函数头中,但是在函数内部出现了“无法将带[]的索引应用于'T'类型的表达式”错误 我想我需要制作一个界面来让它工作(?),但我没有太多/任何这方面的经验 这是我想将其转换为通用函数

我编写了一个函数,将数据表的值转换为格式为“value1,value2,value3,…”的字符串。该函数还接受columnindex和一个包围符(通常为“'))作为参数

我不想为这个函数编写很多不同的变体(例如,一个带有数据集,一个带有列表等等),我只想为它创建一个通用函数

我已经尝试将和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;
}
有谁能帮助我们将其转换为一个通用函数,该函数可以将数据集、数据表、字符串数组、列表以及可能的其他内容作为输入参数?

简短说明:

可能您失败的方法如下所示:

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));;
        }
GenerateWhereInListFromData(new List<System.Data.DataRow>(), t => t[0].ToString(), ",");
公共静态字符串生成器,其中inListFromDataFail(IEnumerable dt_数据,int columnIndex,字符串分隔符)
{
返回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));;
    }
public静态字符串生成器whereinListFromData(IEnumerable dt_数据、Func列访问器、字符串分隔符)
{
返回string.Join(“,”,dt_data.Select(tmp=>分隔符+列访问器(tmp)+分隔符));;
}
方法的调用如下所示:

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));;
        }
GenerateWhereInListFromData(new List<System.Data.DataRow>(), t => t[0].ToString(), ",");
GenerateWhereInListFromData(新列表(),t=>t[0].ToString(),“,”);
我希望我能帮助你

编辑部分:


回答你评论中的问题。 您不需要定义其他一些方法来和不同的类型交互。 你只需要得到舒尔,就可以与所有人一起工作

也许一些代码可以解释我想说的话:

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, ",");
System.Data.DataSet数据集=null;
var result=GenerateWhereInListFromData(dataSet.Tables.Cast(),t=>t.TableName,“,”;
System.Data.DataTable DataTable=null;
结果=GenerateWhereInListFromData(dataTable.Rows.Cast(),t=>t[“SomeColumn”]。ToString(),“,”);
结果=GenerateWhereInListFromData(dataTable.Columns.Cast(),t=>t.ColumnName,”,”;
extensionMethod.Cast()可以很好地完成这项工作。它将所有内部对象强制转换为某个IEnumerable

因此,结果可能如下所示:

表1,表2,表3

价值1,价值2,价值3


Column1、Column2、Column3、

要使泛型函数正常工作,需要找到一个适用于传入的所有类型的接口,如iList、ICollection、IEnumerable等。如果找不到所有类型的接口,尝试检查所有这些接口的对象类型,并使用代码将数据复制到一个列表中,然后加入该列表

您好,谢谢您的详细回复!是的,我的“失败”方法看起来很像!我还是一个新的委托人,我知道它本质上是一个指向函数的指针,但我仍然缺乏实践。我是否必须编写一个函数columnAccess,它接受一个泛型并返回一个字符串,然后在其中添加DataTable、DataSet等的所有案例?你能给我举个简单的例子吗?非常感谢!我想我需要定义另一个方法,但它基本上只是作为lambda表达式传递。所以我注意到我可以将DataTable作为dt.aseneumerable()传入,也可以将DataSet作为ds.Tables[xxx].aseneumerable()传入。这就是我需要的。谢谢:-)如果您这样做是为了生成sql查询
。。WHERE列在('value1','value2','value3',…)
-由于可能的Sql注入和性能原因,请不要这样做。相反,你可以使用