1

匿名型をカスタムクラスでObservableCollectionに返すLINQステートメントの変換に苦労しています。LINQステートメントに満足しています。クラス定義の問題は(私が思うに)、実装方法に関係しています。匿名型とクラス自体の間のIQueryableインターフェイス。

public class CatSummary : INotifyPropertyChanged
{
    private string _catName;
    public string CatName
    {
        get { return _catName; }
        set { if (_catName != value) { _catName = value; NotifyPropertyChanged("CatName"); } }
    }

    private string _catAmount;
    public string CatAmount
    {
        get { return _catAmount; }
        set { if (_catAmount != value) { _catAmount = value; NotifyPropertyChanged("CatAmount"); } }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    // Used to notify Silverlight that a property has changed.
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            //MessageBox.Show("NotifyPropertyChanged: " + propertyName);

        }
    }

}

private void GetCategoryAmounts()
{
    var myOC = new ObservableCollection<CatSummary>();


    var myQuery = BoughtItemDB.BoughtItems
                        .GroupBy(item => item.ItemCategory)
                        .Select(g => new 
                        { 
                            _catName = g.Key, 
                            _catAmount = g.Sum(x => x.ItemAmount)
                        });

    foreach (var item in myQuery) myOC.Add(item);
}

私が得ているエラーは最後の行にあり、
"Argument 1: cannot convert from 'AnonymousType#1' to 'CatSummary'"

私はc#に比較的慣れていないので、正しい方向を指す必要があります。この種のチュートリアルがあれば、それも役に立ちます。

4

3 に答える 3

3

これは、作成している匿名オブジェクトがとタイプの関係がないためCatSummaryです。これらのアイテムをObservableCollectionに追加する場合は、次のCatSummaryように作成する必要があります。

BoughtItemDB.BoughtItems.GroupBy(item => item.Category)
       .Select(x => new CatSummary
       {
           CatName = x.Key,
           CatAmount = x.Sum(amt => amt.ItemAmount)
       });

このように、クエリはのIEnumerable<CatSummary>代わりにを作成しますIEnumerable<a'>。他の言語やそのダックタイピングとは異なり、新しく作成された匿名オブジェクトにCatNameプロパティとCatAmountプロパティがあるからといって、実際のタイプの代わりになるわけではありません。

于 2012-04-16T20:11:16.243 に答える
0

で匿名タイプを選択するのではなく、new { ...new CatSummary(...(またはCatSummaryインスタンスを構築する他の方法で利用できる)CatSummaryインスタンスを選択できます。

于 2012-04-16T20:12:05.027 に答える
0

これを試して:

 foreach (var item in myQuery) 
 {
     // You will need to create a new constructor
     var catsummary = new CatSummary(item.CatName, item.CatAmount);
     myOC.Add(catsummary); 
  }
于 2012-04-16T20:15:36.447 に答える