我有一個接口IRenderable
和一個管理呈現實現接口的類的所有實例的類。如何在插入列表時執行基於規則的對象排序
我在我的代碼中有很多類,並期望別人創建實現相同接口的類。
由於渲染的本質,我想說的是「在此類的實例之前繪製此類的實例」。
典型的方法是讓每一個類實現一個DrawOrder
財產,但是我不喜歡這一點,因爲類沒有一個明確的抽籤順序值,它是相對順序的事項。如果我給每個班級一個DrawOrder
屬性,那麼實現該接口的任何人都需要知道所有班級的價值。顯然,如果很多人能夠實施他們自己的課程,這是不可能的。
我想什麼是能夠定義規則說「ClassA的ClassB的前,ClassA的前ClassC」,然後制定出在平局順序/添加情況下,我可以推斷出正確的繪製順序。其他實現接口的人可以添加他們自己的規則,這些規則與內置的實現和他們自己的添加相關
編輯:什麼我希望的是一些管理規則和管理維護的順序,像下面的類:
class Renderer
{
private List<Rule> Rules;
private List<IRenderable> Renderables;
// Adds to list of rules
void EnforceBefore(Type FirstClass, Type SecondClass);
// Inserts items ensuring all rules are followed.
void Insert(IRenderable ClassInstance);
void RenderAll();
}
類可以再添加規則,適當的(或我可以有一個返回它們的接口方法)。
下面是一個快速測試不起作用
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
List<string> MyList = new List<string> { "wherever", "second", "first", "third", "first", "third", "second" };
RuleBasedComparer<string> RuleComparer = new RuleBasedComparer<string>();
// I want to ensure all instances of "first" appear in the list before all instances of "second"
// and all instances of "second" appear in the list before all instances of "third".
// I don't care where "wherever" appears (or anything beyond the above rules)
RuleComparer.AddRule("first", "second");
RuleComparer.AddRule("second", "third");
MyList.Sort(RuleComparer);
foreach (var item in MyList)
Console.WriteLine(item);
Console.ReadKey();
}
}
public class RuleBasedComparer<T> : Comparer<T>
{
private class OrderRule
{
public readonly T Before;
public readonly T After;
public OrderRule(T before, T after)
{
Before = before;
After = after;
}
}
private List<OrderRule> _Rules = new List<OrderRule>();
public void AddRule(T before, T after)
{
_Rules.Add(new OrderRule(before, after));
}
public override int Compare(T x, T y)
{
// Find the applicable rule for this pair (if any)
var ApplicableRule = _Rules.Where(or => or.After.Equals(x) && or.Before.Equals(y) ||
or.After.Equals(y) && or.Before.Equals(x)).SingleOrDefault();
if (ApplicableRule != null)
{
// If there is a rule then if x should be before y then return -1, otherwise return 1
if (ApplicableRule.Before.Equals(x))
return -1;
else
return 1;
}
else
{
// If no rule exists then say they are equal
return 0;
}
}
}
TL; DR:我如何從這樣說:「ClassB的前ClassA的」規則去確定排序的實例/類。
由缺乏完整的規則而產生的含糊不應該是重要的,我只想遵守現有的規則。
感謝您的想法。用於編碼規則的屬性。這是我主要遇到麻煩的算法。 – 2012-03-27 09:23:20