-1

我在 C# 中执行 sql 查询时遇到问题。当字符串在 IN CLAUSE 中包含超过 1000 个条目时,sql 查询会引发错误。字符串有超过 1000 个子字符串,每个子字符串由“,”分隔。

我想将字符串拆分为字符串数组,每个字符串数组包含 999 个以“,”分隔的字符串。

或者

如何在字符串中找到第 n 次出现的 ','。

4

6 回答 6

0

使用实用程序代码将字符串从 SQL 服务器拉到数据集中

string strResult = String.Empty;
using (SqlCommand cmd = new SqlCommand())
{
    cmd.Connection = conn;
    cmd.CommandText = strSQL;
    strResult = cmd.ExecuteScalar().ToString();
}

从 SQL Server 获取返回的字符串

拆分','上的字符串

string[] strResultArr = strResult.Split(',');

然后得到由','分隔的第n个字符串(我认为这就是“我如何在字符串中找到','的第n个出现的意思。”使用

int n = someInt;
string nthEntry = strResultArr[someInt - 1];

我希望这有帮助。

于 2013-01-10T07:59:11.070 回答
0

您可以使用正则表达式和类的Index属性Match

// Long string of 2000 elements, seperated by ','
var s = String.Join(",", Enumerable.Range(0,2000).Select (e => e.ToString()));

// find all ',' and use '.Index' property to find the position in the string
// to find the first occurence, n has to be 0, etc. etc.
var nth_position = Regex.Matches(s, ",")[n].Index;

要创建所需大小的字符串数组,您可以拆分字符串并使用 LINQGroupBy对结果进行分区,然后将结果组连接在一起:

var result = s.Split(',').Select((x, i) => new {Group = i/1000, Value = x})
                         .GroupBy(item => item.Group, g => g.Value)
                         .Select(g => String.Join(",", g));

result现在包含两个字符串,每个字符串都有 1000 个逗号分隔的元素。

于 2013-01-10T08:02:12.263 回答
0

这个怎么样:

    int groupSize = 1000;

    string[] parts = s.Split(',');
    int numGroups = parts.Length / groupSize + (parts.Length % groupSize != 0 ? 1 : 0);

    List<string[]> Groups = new List<string[]>();
    for (int i = 0; i < numGroups; i++)
    {
        Groups.Add(parts.Skip(i * groupSize).Take(groupSize).ToArray());
    }
于 2013-01-10T08:11:13.397 回答
0

也许是这样的:

string line = "1,2,3,4";
var splitted = line.Split(new[] {','}).Select((x, i) => new {
                                                                Element = x,
                                                                Index = i
                                                            })
                                      .GroupBy(x => x.Index / 1000)
                                      .Select(x => x.Select(y => y.Element).ToList())
                                      .ToList();

在此之后,您应该只是String.Join每个IList<string>.

于 2013-01-10T08:11:41.063 回答
-1
//initial string of 10000 entries divided by commas
string s = string.Join(", ", Enumerable.Range(0, 10000));
//an array of entries, from the original string
var ss = s.Split(',');
//auxiliary index
int index = 0;

//divide into groups by 1000 entries
var words = ss.GroupBy(w =>
    {
        try
        {
            return index / 1000;
        }
        finally
        {
            ++index;
        }
    })//join groups into "words"
    .Select(g => string.Join(",", g));

//print each word
foreach (var word in words)
    Console.WriteLine(word);

或者您可能会在字符串中找到索引,然后将其拆分为子字符串:

string s = string.Join(", ", Enumerable.Range(0, 100));
int index = 0;

var indeces =
Enumerable.Range(0, s.Length - 1).Where(i =>
    {
        if (s[i] == ',')
        {
            if (index < 9)
                ++index;
            else
            {
                index = 0;
                return true;
            }
        }
        return false;
    }).ToList();

Console.WriteLine(s.Substring(0, indeces[0]));
for (int i = 0; i < indeces.Count - 1; i++)
{
    Console.WriteLine(s.Substring(indeces[i], indeces[i + 1] - indeces[i]));
}

但是,我会考虑一下,是否可以在将条目组合成一个字符串之前使用它们。并且可能会想,如果有可能避免进行需要将该大列表传递到IN语句中的查询的必要性。

于 2013-01-10T08:03:50.363 回答
-2
string foo = "a,b,c";

string [] foos = foo.Split(new char [] {','});

foreach(var item in foos)
{
   Console.WriteLine(item);
}
于 2013-01-10T07:52:15.553 回答