我正在努力从头开始创建一个数据库.我有一个锯齿状的叫做data数组,我试着克隆(lns)它,克隆(lns)变成小写,所以也data变成了.但我不希望这样!我怎么能阻止这个?ignorecase是真的.如果我将其设置为false,则不再出现问题.
你可能不相信,至少我没有,所以我上传了一个视频.
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...
Run Code Online (Sandbox Code Playgroud)
编辑:好的,我现在知道这lns = data不是克隆,而只是制作另一个变量.但是我如何克隆它以便我可以执行此代码?
在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];
// ..
Run Code Online (Sandbox Code Playgroud)
对于更整洁的不区分大小写的替代方法,请参阅不区分大小写的'包含(字符串)'和/或考虑使用谓词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];
// ..
Run Code Online (Sandbox Code Playgroud)
只是C#期待的一些精彩......我可能也会使用LINQ/IEnumerable而不是数组.