Как я сказал в своем предыдущем сообщении, вот некоторый код в C#, который реализует O (1) матричное вращение для любой матрицы размера. Для краткости и удобочитаемости там не проверка ошибок или проверка диапазона. Код:
static void Main (string [] args)
{
int [,]
// create an arbitrary matrix
m = {{0, 1}, {2, 3}, {4, 5}};
Matrix
// create wrappers for the data
m1 = new Matrix (m),
m2 = new Matrix (m),
m3 = new Matrix (m);
// rotate the matricies in various ways - all are O(1)
m1.RotateClockwise90 ();
m2.Rotate180 ();
m3.RotateAnitclockwise90 ();
// output the result of transforms
System.Diagnostics.Trace.WriteLine (m1.ToString ());
System.Diagnostics.Trace.WriteLine (m2.ToString ());
System.Diagnostics.Trace.WriteLine (m3.ToString ());
}
class Matrix
{
enum Rotation
{
None,
Clockwise90,
Clockwise180,
Clockwise270
}
public Matrix (int [,] matrix)
{
m_matrix = matrix;
m_rotation = Rotation.None;
}
// the transformation routines
public void RotateClockwise90 ()
{
m_rotation = (Rotation) (((int) m_rotation + 1) & 3);
}
public void Rotate180 ()
{
m_rotation = (Rotation) (((int) m_rotation + 2) & 3);
}
public void RotateAnitclockwise90 ()
{
m_rotation = (Rotation) (((int) m_rotation + 3) & 3);
}
// accessor property to make class look like a two dimensional array
public int this [int row, int column]
{
get
{
int
value = 0;
switch (m_rotation)
{
case Rotation.None:
value = m_matrix [row, column];
break;
case Rotation.Clockwise90:
value = m_matrix [m_matrix.GetUpperBound (0) - column, row];
break;
case Rotation.Clockwise180:
value = m_matrix [m_matrix.GetUpperBound (0) - row, m_matrix.GetUpperBound (1) - column];
break;
case Rotation.Clockwise270:
value = m_matrix [column, m_matrix.GetUpperBound (1) - row];
break;
}
return value;
}
set
{
switch (m_rotation)
{
case Rotation.None:
m_matrix [row, column] = value;
break;
case Rotation.Clockwise90:
m_matrix [m_matrix.GetUpperBound (0) - column, row] = value;
break;
case Rotation.Clockwise180:
m_matrix [m_matrix.GetUpperBound (0) - row, m_matrix.GetUpperBound (1) - column] = value;
break;
case Rotation.Clockwise270:
m_matrix [column, m_matrix.GetUpperBound (1) - row] = value;
break;
}
}
}
// creates a string with the matrix values
public override string ToString ()
{
int
num_rows = 0,
num_columns = 0;
switch (m_rotation)
{
case Rotation.None:
case Rotation.Clockwise180:
num_rows = m_matrix.GetUpperBound (0);
num_columns = m_matrix.GetUpperBound (1);
break;
case Rotation.Clockwise90:
case Rotation.Clockwise270:
num_rows = m_matrix.GetUpperBound (1);
num_columns = m_matrix.GetUpperBound (0);
break;
}
StringBuilder
output = new StringBuilder ();
output.Append ("{");
for (int row = 0 ; row <= num_rows ; ++row)
{
if (row != 0)
{
output.Append (", ");
}
output.Append ("{");
for (int column = 0 ; column <= num_columns ; ++column)
{
if (column != 0)
{
output.Append (", ");
}
output.Append (this [row, column].ToString ());
}
output.Append ("}");
}
output.Append ("}");
return output.ToString ();
}
int [,]
// the original matrix
m_matrix;
Rotation
// the current view of the matrix
m_rotation;
}
хорошо, я подниму руку, она на самом деле не делает никаких модификаций к исходному массиву при вращении. Но, в системе OO, которая не имеет значения, пока объект похож, он был повернут клиентам класса. В данный момент Матричные ссылки использования класса на данные исходного массива, настолько изменяющиеся любое значение m1, также изменят m2 и m3. Небольшое изменение конструктора, чтобы создать новый массив и скопировать значения в него уладит это.
Для этого есть как минимум 2 различных способа:
Командная строка
В Team Explorer есть утилита командной строки под названием Tf.exe. Найдите документацию здесь . Доступ к нему можно получить, запустив окно командной строки Visual Studio. Синтаксис команды:
tf undo [/workspace:workspacename[;workspaceowner]]
[/server:servername] [/recursive] itemspec [/noprompt]
Для одного файла
tf undo /workspace:workspacename;workspaceowner $/projectname/filename.cs
GUI
Второй - через графический интерфейс, но не входит в стандартную комплектацию - вам необходимо установить TFS Power Tools . См. здесь для получения подробной информации о том, как использовать этот метод.
Имейте в виду, что для любого метода вам потребуются соответствующие права. Разрешения называются «Отменить изменения других пользователей» и «Разблокировать изменения других пользователей». Эти разрешения можно просмотреть:
Удаление рабочего пространства
tf workspace /delete WorkspaceName;User
/server:http://server:8080/tfs/MyTeamCollection
Самый простой способ, который я нашел, - это использовать бесплатное приложение TFS Sidekick . У него есть возможность просмотреть и отменить оформление заказа другим пользователем.