2009-07-20 9 views
2

私は、受信者がEMailRecipientまたはSMSRecipientsのいずれかになる抽象クラスを持っています。Linqグループ

ListのデータをList<Recipient>のように選択してください。統計的な理由から、私はSMSRecipientのCountryCodeに基づいて受信者の数を知る必要があり、私はlinqでそれを行うことができると思った。しかし、私は

var q = from v in AMessageQueueContentList 
     group v by (FlexyNet.Data.SMSRecipient)v.Recipient into g 
     select count(g); 

ようSMSRecipientとして受信者を投げているように見えるカント私のクラスには、次のようになります。

public abstract class Recipient 
{ 
    public int MemberID { get;set;} 
    public Recipient(){} 
} 

public class EMailRecipient : Recipient 
{ 
    public string EMail { get; set; } 
    public bool ValidMail { get; set; } 

    public EMailRecipient(FlexyDataReader read) 
    { 
     this.MemberID = (int)read["MemberID"]; 
     this.EMail = (string)read["Recipient"]; 
    } 

    public EMailRecipient(int memberID,string eMail) 
    { 
     this.MemberID = memberID; 
     this.EMail = (string)eMail; 
    } 


} 

public class SMSRecipient : Recipient 
{ 
    public string Number { get; set; } 
    public string CountryCode { get; set; } 
    public nimta.Recipient NimtaRecipient { get; set; } 
} 
+1

- 何を停止していますか?何がうまくいかないの? –

+0

[こちら](http://www.arpitkhandelwal.com/2011/10/grouping-in-linq-c.html)はグループ化の例であり[this](http://www.arpitkhandelwal.com/2011 /12/c-linq-to-objects-using-groupby-with.html)。私はこれがあなたが探しているものだと願っていますか? –

答えて

4

あなたはこのような何かを行うことができますか?

var counts = from m in AMessageQueueContentList 
      let s = m.Recipient as FlexyNet.Data.SMSRecipient 
      where s != null 
      group s by s.CountryCode into g 
      select new { CountryCode = g.Key, Count = g.Count() }; 

それとも、実際に受信者オブジェクトのリストを持っている場合は、LINQのOfType<T>()拡張メソッドを使用できます:あなたは、「キャストように見えることはできません」と言うとき

var sms = recipients.OfType<FlexyNet.Data.SMSRecipient>(); 
var counts = from s in sms 
      group s by s.CountryCode into g 
      select new { CountryCode = g.Key, Count = g.Count() };