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ではないので

私はあなたがこれで何を意味するのか本当に理解していません。

IEnumerableエラーについては、からにキャストできないと表示されExpenseItemます。あなたはそのようにあなたの最終的な例のようにそれを適用し、ではなくアイテムを返す必要がありますIEnumerableWhere条項をスキップして、すぐに使用します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; 

優れた設計により、ファインダーが1つのレコードのみと正確に一致する場合、たとえば主キーによって

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

、FirstOrDefaultを使用すると、次のようなファインダーメソッドを使用できます。

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