Я использовал бы !}uniq
, но который только работает, при отсутствии пустых строк.
Для каждой строки в использовании файла: :1,$!uniq
.
Возможно, здесь что-то не хватает, но вместо оператора switch
, что не так с
((Command)myMap.get(instructionFromString)).execute();
Если инструкцияFromString представляет собой char
, преобразование его в String
перед поиском по карте, иначе используйте ключи Character
на вашей карте.
Кроме того, если вы используете общую карту Java 5, вы можете удалить приведение на Команда
. Очищенная версия будет выглядеть так:
private Map<Character, Command> myMap = new HashMap<Character, Command>();
myMap.put('A', new CommandA());
myMap.put('B', new CommandB());
myMap.put('C', new CommandC());
myMap.put('D', new CommandD());
, за которой следует:
char instructionFromString = ....
myMap.get(instructionFromString).execute();
Помимо уже заявленных ответов об использовании Vector, Vector также имеет множество методов перечисления и извлечения элементов, которые отличаются от интерфейса List, и разработчиков (особенно тех, кто изучал Java до 1.2) могут использовать их, если они есть в коде. Хотя перечисления работают быстрее, они не проверяют, была ли коллекция изменена во время итерации, что может вызвать проблемы, и, учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что будет нелегко заменить его другой реализацией List.
Вы хотите, чтобы если кто-то набрал URL страницы прямо в браузере и добавил к нему ? Id = x , вы должны направить его на соответствующую страницу, выбрать соответствующую строку и заполнить FormView на основе выбранная запись.Что ж, если это так, я кое-что сделал, но позвольте мне заранее предупредить, что это не очень элегантно и сейчас 2:30 утра, поэтому, пожалуйста, не смейтесь.
Предположение: - В представленном решении поле DataKeyNames установлено как Первичный ключ исходной таблицы. Выбранные строки сортируются по этому ключу. Я использую SubSonic 3 для общения с SQL Server 2005 Express DB (по совпадению, это мой первый проект SS3, очень занят в офисе, чтобы попробовать его).
Определение таблицы выглядит следующим образом:
Create Table StudentsTable
( EnrolmentNumber int not null identity primary key,
StudentName nvarchar(50) not null)
aspx:
<asp:GridView ID="gvStudents" runat="server" AllowPaging="True" PageSize="3"
OnSelectedIndexChanged="GridRowChanged" OnPageIndexChanging="GridPageChanging"
DataKeyNames="EnrolmentNumber">
<RowStyle BackColor="LightBlue" />
<AlternatingRowStyle BackColor="LightCoral" />
<Columns>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server"
CommandName="Select" Text="Select"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<SelectedRowStyle BackColor="Red" BorderColor="Yellow" />
</asp:GridView>
<asp:FormView ID="fvSubjects" runat="server" AllowPaging="false"
Caption="Student" CaptionAlign="Left">
<ItemTemplate>
<table>
<tr>
<td>Enrolment Number</td>
<td><asp:Label ID="lblEN" runat="server"
Text=<%# Eval("EnrolmentNumber") %> /></td>
</tr>
<tr>
<td>Student Name</td>
<td><asp:Label ID="lblName" runat="server"
Text=<%# Eval("StudentName") %> /></td>
</tr>
</table>
</ItemTemplate>
</asp:FormView>
Код C # (сдержите смех):
private IList<StudentsTable> students;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadData();
CheckQueryString(students);
}
}
private void LoadData()
{
students = StudentsTable.All().ToList();
gvStudents.DataSource = students;
gvStudents.DataBind();
}
private void CheckQueryString(IList<StudentsTable> students)
{
if (!Request.QueryString.HasKeys() ||
string.IsNullOrEmpty(Request.QueryString["erno"]))
{
return;
}
var erno = Request.QueryString["erno"];
int key;
if (!int.TryParse(erno, out key))
return;
for (var i = 0; i < students.Count; i++)
{
if (students[i].EnrolmentNumber == key)
{
SetPageSize(students, i);
break;
}
}
}
private void SetPageSize(IList<StudentsTable> students, int i)
{
var ps = gvStudents.PageSize;
var cp = i / ps;
var ridx = i - ps - 1;
var pageEvent = new GridViewPageEventArgs(cp);
GridPageChanging(null, pageEvent);
gvStudents.SelectedIndex = ridx;
GridRowChanged(null, EventArgs.Empty);
}
protected void GridRowChanged(object sender, EventArgs e)
{
var rIdx = gvStudents.SelectedIndex;
if (rIdx < 0) return;
var key = gvStudents.DataKeys[rIdx];
var lst= StudentsTable.Find(x => x.EnrolmentNumber == (int)key.Value);
SetFormView(lst);
}
private void SetFormView(IList<StudentsTable> student)
{
fvSubjects.DataSource = student;
fvSubjects.DataBind();
}
protected void GridPageChanging(object sender, GridViewPageEventArgs e)
{
var p = e.NewPageIndex;
if (p > gvStudents.PageCount)
p = gvStudents.PageCount - 1;
gvStudents.PageIndex = p;
LoadData();
}
PS: - Ошибка, если вы поместите идентификатор последней записи.
Мне нравится ответ Скаффмана. Я только хочу добавить еще:
Для наименования ваших команд вы можете использовать более простой шаблон. Например, вы можете использовать имя команды по умолчанию.
Существует множество технологий, позволяющих связать имя и команду. Примеры: