我正在努力从头开始创建数据库。
我有一个称为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
没有制作克隆,只是制作另一个变量。但是我如何克隆它以便我可以执行此代码?
答案 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。