string [] []得到小写

时间:2014-02-28 19:30:28

标签: c# c#-4.0

我正在努力从头开始创建数据库。 我有一个称为data数组的锯齿状,我尝试克隆它(lns),克隆(lns)变为小写,因此data也变为小写。但我不希望这样!我怎么能阻止这个? ignorecase是真的。如果我将其设置为false,则不再出现问题。

你可能不相信,至少我不相信,所以I uploaded a video

    public string[][] getRows(string[][] data, int columnLength, int index = -1, string arg = "", bool ignoreCase = false, bool getContaining = false)
    {
        if (index >= columnLength) return null; // I love null!
        if (!getContaining && arg == "") return data;

        string[][] toReturn = new string[data.Length][];
        string[][] lns = data;
        int a = 0;

        if (ignoreCase)
        {
            arg = arg.ToLower();
            for (int i = 0; i < columnLength; i++)
                for (int j = 0; j < lns.Length; j++)
                    lns[j][i] = lns[j][i].ToLower();
        }



        if (index >= 0)
        {
            if (getContaining)
            {
                for (int i = 0; i < data.Length; i++)
                    if (lns[i][index].Contains(arg))
                    {
                        toReturn[a] = data[i];
// code continues...

编辑:好的,我现在知道lns = data没有制作克隆,只是制作另一个变量。但是我如何克隆它以便我可以执行此代码?

2 个答案:

答案 0 :(得分:5)

string[][] lns = data;中,在分配期间没有制作数据数组的副本/克隆/重复

所以lns[j][i] = lns[j][i].ToLower();相当于data[j][i] = data[j][i].ToLower(); 修改原始数据/数组。

我只是将不区分大小写的比较移动到条件本身。琐碎的,可能如下所示 - 记得删除原始的if (ignoreCase) {..}代码。

// Move logic to condition (don't change any data)
  if (ignoreCase && lns[i][index].ToLower().Contains(arg.ToLower())
      || lns[i][index].Contains(arg)) {
    toReturn[a] = data[i];
    // ..

对于更整洁的不区分大小写的替代方案,请参阅Case insensitive 'Contains(string)'和/或考虑使用谓词lambda /函数。


好吧,因为我确实提到过“整洁”的方式..

// Predicate methods (defined in class) 
bool ContainsSensitive (string a, string b) {
   return a.Contains(b);
}
bool ContainsInsensitive (string a, string b) {
   // From https://stackoverflow.com/a/444818/2864740
   return a.IndexOf(b, StringComparison.OrdinalIgnoreCase) >= 0;
}

// In function:
Func<string,string,bool> contains = ignoreCase
    ? ContainsInsensitive
    : ContainsSensitive;

// Move logic to condition, but use predicate function to move
// the actual logic elsewhere.
  if (contains(lns[i][index], arg)) {
    toReturn[a] = data[i];
    // ..

期待C#的一些精彩......我可能也会使用LINQ / IEnumerable而不是数组。

答案 1 :(得分:2)

这一行:

string[][] lns = data;

不“克隆”数组(我假设你的意思是创建一个相同大小/形状的重复数组,相应的插槽中具有相同的值)。内存中有一个数组存储在data变量中。这只是声明一个新的lns变量并将其指向同一个数组。如果您访问另一个变量,通过一个变量进行的任何更改都将是相同的。

所有参考类型都适用。有关更详细的说明,请参阅this article by Jon Skeet