将字符串[]转换为Array
本文关键字:Array 转换 字符串 | 更新日期: 2023-09-27 17:54:25
我现在对数据类型有点迷失了。
在我正在构建的应用程序中,我有一个函数必须运行查询,这取决于客户ID的Array
。
数据必须在特定条件下被覆盖,使用由ID字符串组成的数组。
问题是Split()
函数返回string[]
,而我的数据是Array
。我可以将新值赋给data
,如下所示,但这样我就不能再访问数据了。
这是因为对于Array
,我必须使用data.GetValue(i)
,而string[]
只能使用data[i]
访问。
剥离代码:
internal void GetData(Array data) {
string ids == "123,456,789";
if(condition){
data = (Array) ids.Split(',').ToArray(); // Trying to convert it to a Array, can't figure it out...
}
// Accessing the data at index `i`
data.GetValue(i); // Default case, works when the condition is false
data[i]; // This only works when the condition is true
}
所以,我的问题是,有没有办法让我保存我的分割字符串到Array
而不是string[]
?
完整代码:
internal M.RequestCustomQueryResultsList GetData(Array data) {
M.RequestCustomQueryResultsList result = new M.RequestCustomQueryResultsList();
result.CustomQueryResults = new List<CustomQueryResult>();
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
conn.Open();
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.CommandText = queriesQuery; // StacOverflow: A query to obtain some queries
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read()) {
// For each query
SqlConnection conn1 = new SqlConnection(connectionString);
conn1.Open();
/* StackOverflow: The real relevant stuff starts here. */
String query = reader["Query"].ToString(); // Get the current query
Match match = Regex.Match(query, @"{((?:'w,?)*)}");
if(match.Success) { // If the query contains "{0}" or "{123,456,789,etc}"
string m = match.Groups[1].Value; // get the value in the "{}"
if(!m.Equals("0")){ // If that value isn't "123,456,etc"
data = m.Split(','); // Split up the id's into an array.
}
for(int i = 0; i < data.Length; i++) { // Loop through the data (Works if m.Equals("0"))
// Execute the query for every company.
String q = string.Format(query, data.GetValue(i).ToString()); // Fails
CustomQueryResult c = new CustomQueryResult();
c.CustNo = int.Parse(data.GetValue(i).ToString()); // Fails
// Here I set some more values to c, add c to `result`, and close all loops / etc.
GetData
是作为GetCustomQueriesResults
请求调用到服务的一部分。
public T.RequestCustomQueryResultsList GetCustomQueriesResults(Array data) {
var CustomQueriesResultsList = new S.CustomQueriesResultsList(data);
return CustomQueriesResultsList.GetData(data);
}
我从JavaScript调用服务,像这样:
repo.GetCustomQueriesResults([123,456,789]);
repo构建了一个ajax请求,使用JSON.stringify(data)
作为data
参数
一个string[]
已经是一个Array
(因为每个具体的数组类型都是从Array
派生的)- Split
已经给出了一个string[]
,所以你不需要在结果上调用ToArray
。
:
data = (Array) ids.Split(',').ToArray();
可以是:
data = ids.Split(',');
结果是一个数组,因此没有其他工作要做。
注意,改变data
的值将不会改变调用者的数组,如果这是错误的。您应该阅读我关于参数传递的文章,以了解更多关于这方面的内容。
编辑:现在我们可以看到你的代码,我相信这个问题与数组关系不大。它是这样的:
String q = string.Format(query, data.GetValue(i).ToString()); // Fails
我强烈怀疑您的查询包含类似{1}
的东西,它试图使用不存在的参数格式化。
这应该很容易验证-只需将部分分开:
String value = data.GetValue(i).ToString();
String q = string.Format(query, value);
直接赋值:
data = ids.Split(',');
你不需要cast,你也不需要ToArray
.
GetValue
在这两种情况下都可以正常工作(参见下面的LinqPad代码片段)。这是意料之中的,因为Array
是所有数组的基类,所以GetValue
是继承的。你可能在别的地方做错了什么。
void Main()
{
Array myArr = Array.CreateInstance( typeof(String),1);
myArr.SetValue("a",0);
GetData(myArr,true); // condition is true, use the split. Outputs "123"
GetData(myArr,false); // use the array we pass to the method. Outputs "a"
}
void GetData(Array data, bool condition) {
string ids = "123,456,789";
if(condition)
{
data = ids.Split(',');
}
Console.WriteLine(data.GetValue(0));
}
ArrayType没有声明任何索引器。这就是为什么你不能在数组类型的对象上使用[]。
说我不能理解从哪里来的能力调用一个索引器的Split()结果
但是你可以替换
GetData(Array data)
GetData(Object[] data)