2

我有一门课,ExpenseItem还有一个基于该课的列表。

我目前正在设计一个具有组合框的表单,该组合框允许我选择特定类型的ExpenseItem旅行,并在列表框中显示所有结果。

表单代码(tripSelect是组合框,listExpenses是列表框):

    private void LoadExpenseList()
    {
        tripSelect.Items.Clear();
        var dateSorted =
            from e in roster
            group e by e.Trip into tripGroup
            select new { Trip = tripGroup.Key };
        foreach (var e in dateSorted)
            tripSelect.Items.Add(e.Trip);
    }

    private void LoadExpenseDetail()
    {
        listExpenses.Items.Clear();
        var dateSorted =
            from e in roster
            orderby e.Trip
            select e;
        foreach (var e in dateSorted) ;
    }

    private void ExpenseRecorderForm_Load(object sender, EventArgs e)
    {

    }

    private void tripSelect_SelectedIndexChanged(object sender, EventArgs e)
    {
        selectedExpense = (ExpenseItem)roster.ToFind((string)tripSelect.SelectedItem);
        listExpenses.Items.Add(selectedExpense);
    }


    private void listExpenses_SelectedIndexChanged(object sender, EventArgs e)
    {
        tripTextBox.Text = selectedExpense.Trip;
        tripTextBox.Enabled = false;
        descriptionTextBox.Text = selectedExpense.Description;
        amountTextBox.Text = selectedExpense.Amount.ToString();
        paymentMethodTextBox.Text = selectedExpense.PaymentMethod;
        dateExpenseTimePicker.Value = selectedExpense.Date;
        dateExpenseTimePicker.Enabled = true;
        noteTextBox.Text = selectedExpense.Note;
    }
4

2 回答 2

1

我无法编写类似 myVariable.Where(); 的代码 因为它不是 IEnumerable

我真的不明白你的意思。

至于错误,它说你不能从IEnumerableto 转换ExpenseItem。您必须像最终示例一样应用它并返回项目而不是IEnumerable. 我会跳过该Where子句并直接使用FirstOrDefault

public ExpenseItem ToFind(string trip)
{
    return this.FirstOrDefault(e => e.Trip == trip);
}

我认为this是定制的集合,否则 Linq 扩展将无法使用this

编辑

如果你真的想要这个..

public IEnumerable<ExpenseItem> ToFind(string trip)
{
    return this.Where(e => e.Trip == trip);
}

然后,您将需要处理来自调用者的列表。

private void tripSelect_SelectedIndexChanged(object sender, EventArgs e)
{
    IEnumerable<ExpenseItem> selectedExpenses = roster.ToFind((string)tripSelect.SelectedItem);
    foreach(ExpenseItem item in selectedExpenses)
        listExpenses.Items.Add(item);
}
于 2012-04-23T05:02:41.603 回答
0

如果你会使用这个:

public IEnumerable<ExpenseItem> ToFind(string trip)
{
    return this.Where(e => e.Trip == trip);
}

您需要使用它,请注意 FirstOrDefault:

selectedExpense = roster
      .ToFind((string)tripSelect.SelectedItem)
      .FirstOrDefault();

您 selectedExpense 不是 IEnumerable:

private ExpenseItem selectedExpense; 

通过良好的设计,如果查找器仅匹配一条记录,例如通过主键

public ExpenseItem ToFind(string expenseId)
{
    return this.FirstOrDefault(e => e.ExpenseId == expenseId);
}

,使用 FirstOrDefault,然后,您可以像这样简单地使用 finder 方法:

selectedExpense = roster.ToFind(idHere);
于 2012-04-23T05:22:08.670 回答