0

投票可能なアイテムのインターフェースがあります:(StackExchange、Redditなどのように...)

// Irrelevant properties left out (Creator, Upvotes, Downvotes, etc)
internal interface IVotable
{
    double HotScore { get; set; }
    double VoteTotal { get; set; }
    DateTime CreatedDate { get; set; }
}

このインターフェイスを拡張し、コンストラクターを定義して既定のプロパティを設定する具体的な基本クラスがあります。

internal class SCO : IVotable
{
    public double HotScore { get; set; }
    public double VoteTotal { get; set; }
    public DateTime CreatedDate { get; set; }

    public SCO(SPListItem item, List<Vote> votes)
    {
        VoteTotal = UpVotes - DownVotes;
        HotScore = Calculation.HotScore(Convert.ToInt32(UpVotes), Convert.ToInt32(DownVotes), Convert.ToDateTime(item["Created"]));
        CreatedDate = Convert.ToDateTime(item["Created"]);
    }

この基本クラスとそのコンストラクターを拡張する使用中のクラスの例を次に示します。

class Post : SCO
{
    public string Summary { get; set; }
    public Uri Link { get; set; }

    public Post(SPListItem item, List<Vote> votes)
        : base(item, votes)
    {
        Summary = (string) item["Summary"];
        Link = new UriBuilder((string) item["Link"]).Uri;
    }
}

90% 以上の時間で、ページにレンダリングするクラスの並べ替えられたコレクションを返しています。

DataBase アイテムのコレクション、アイテムと一致する投票のリストを取得し、リストを作成し、渡された ENUM に基づいてそのリストを並べ替える汎用メソッドが必要です。並べ替え方法を定義します。

私はいくつかのアプローチを試みましたが、その多くは以前の投稿に基づいています。これに正しい方法でアプローチしているかどうかはわかりません。解決策は機能しますが、読みやすさや使いやすさのために、多くのボクシング、またはリフレクション、またはある種の (おそらく大きな) パフォーマンスの犠牲が見られます。

そのクラスが基本クラスを拡張する限り、後続の子クラスで使用できるオブジェクトのソート済みリストを作成する最良の方法は何ですか?

機能している以前のアプローチ:

基本クラスから <T> のリストを作成する

リストを返すためにリフレクションを使用し<T>て拡張する基本クラスに埋め込まれた汎用リスト:Activator.CreateInstance

public static List<T> SortedCollection<T>(SPListItemCollection items, ListSortType sortType, List<Vote> votes) where T : SCO

使用サンプルのリクエスト:

    static public List<Post> Get100MostRecentPosts(ListSortType sortType)
    {
        var targetList = CoreLists.SystemAccount.Posts();
        var query = new SPQuery
                        {
                            Query = "<OrderBy><FieldRef Name=\"Created\" Ascending=\"False\" /></OrderBy>",
                            RowLimit = 100
                        };
        var listItems = targetList.GetItems(query);
        var votes = GetVotesForPosts(listItems);
        return Post.SortedCollection<Post>(listItems, sortType, votes);
    }
4

0 に答える 0