У меня проблема с тем, что я создал объект DataTable в одном классе и вернул его основной программе. Я вызываю метод (1), который извлекает некоторую информацию из таблицы данных и впоследствии удаляет те же строки. Затем я запускаю другой метод (2), который извлекает данные из столбца, но я вижу, что строки, которые я удалил в другом методе (1), не изменились. Я посчитал количество строк в методе (1) и количество строк уменьшилось, что указывает на то, что они были удалены.
Может ли это быть как-то связано со ссылками на объекты?
Заранее извиняюсь за любые ошибки, которые я допустил, задавая этот вопрос. Это мой первый вопрос к стеку, и я все еще плохо знаком с кодированием.
Заранее спасибо!
Основная программа:
filepath = @"E:\1802370 11.05.18 qCML 6x10E6 ERM_analysed.txt";
//Create a datatable from _analysed file and delete unwated columns
DataTable dataTable = csv.convertToDataTable(filepath);
//Assign slope and r2 values for both BCR and ABL
//Delete rows after
plate.getSlopeandR2(dataTable);
plate.getSampleList(dataTable);
Метод DataTable:
//Converts text file into a datatable to be manipluated.
public DataTable convertToDataTable(string filepath)
{
StreamReader sr = new StreamReader(filepath);
string[] headers = sr.ReadLine().Split('\t');
DataTable dt = new DataTable();
foreach (string header in headers)
{
dt.Columns.Add(header);
}
while (!sr.EndOfStream)
{
string[] rows = Regex.Split(sr.ReadLine(), "\t");
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
sr.Close();
return dt;
Метод (1): получить значения, удалить строки
//Get slope and r2 values
//Delete rows after info is retrieved
public void getSlopeandR2(DataTable dataTable)
{
bool isABL = true;
List<int> rowsToDelete = new List<int>();
Console.WriteLine(dataTable.Rows.Count);
foreach (DataRow row in dataTable.Rows)
{
int rowIndex;
if (row["Well"].ToString() == "Slope" && isABL == true)
{
rowIndex = dataTable.Rows.IndexOf(row);
ablSlope = Convert.ToDouble(dataTable.Rows[rowIndex][1]);
ablR2 = Convert.ToDouble(dataTable.Rows[rowIndex + 2][2]);
isABL = false;
rowsToDelete.Add(rowIndex);
rowsToDelete.Add(rowIndex + 1);
rowsToDelete.Add(rowIndex + 2);
rowsToDelete.Add(rowIndex + 3);
rowsToDelete.Add(rowIndex + 4);
rowsToDelete.Add(rowIndex + 5);
}
else if (row["Well"].ToString() == "Slope" && isABL == false)
{
rowIndex = dataTable.Rows.IndexOf(row);
biomedSlope = Convert.ToDouble(dataTable.Rows[rowIndex][1]);
biomedR2 = Convert.ToDouble(dataTable.Rows[rowIndex + 2][2]);
rowsToDelete.Add(rowIndex);
rowsToDelete.Add(rowIndex + 1);
rowsToDelete.Add(rowIndex + 2);
rowsToDelete.Add(rowIndex + 3);
rowsToDelete.Add(rowIndex + 4);
rowsToDelete.Add(rowIndex + 5);
rowsToDelete.Add(rowIndex + 6);
}
}
for (int i = 0; i < rowsToDelete.Count; i++)
{
dataTable.Rows.RemoveAt(i);
}
Console.WriteLine(dataTable.Rows.Count);
}
Метод (2): получение данных (удаленные строки по-прежнему включены)
//Get unique list of sample ID's on plate
public void getSampleList(DataTable dataTable)
{
string tempValue;
foreach (DataRow row in dataTable.Rows)
{
if (!Samples.Contains(row["Sample Name"].ToString()))
{
tempValue = Convert.ToString(row["Sample Name"]);
Samples.Add(tempValue);
}
}
foreach (string id in Samples)
{
Console.WriteLine(id);
}
}