【发布时间】:2017-01-03 17:49:47
【问题描述】:
我有定义值和少量操作的接口:
public interface IValue<T>
{
T Value { get; }
void InteractionA(IValue<T> target);
void InteractionB(IValue<T> target);
bool Check(IValue<T> target);
}
然后我基于该接口实现类
public class DoubleValue : IValue<double>
{
public double Value { get; private set; }
public bool Check(IValue<double> target)
{
// ...
return false;
}
public void InteractionA(IValue<double> target)
{
// ...
}
public void InteractionB(IValue<double> target)
{
// ...
}
}
现在我想制作一个对值池进行操作并使用泛型的通用操纵器(所以我只写一次)。由于我想在将来使用这个类的方式,它不能被声明为静态的。将泛型类型转移到方法中也没有任何好处。 我能得到的最接近的是:
public class ValueManipulator<T>
{
public IEnumerable<IValue<T>> Pool { get; private set; }
public ValueManipulator(IEnumerable<IValue<T>> pool)
{
Pool = pool;
}
public void ManipulateA()
{
foreach (int i in Enumerable.Range(0, Pool.Count()))
{
IValue<T> firstValue = Pool.ElementAt(i);
foreach (IValue<T> secondValue in Pool.Skip(i))
{
if (firstValue.Check(secondValue))
firstValue.InteractionA(secondValue);
else
firstValue.InteractionB(secondValue);
}
}
}
public void ManipulateB()
{
// ...
}
}
这个 ValueManipulator 类的主要问题是我需要知道 DoubleValue 中使用的 IValue 的 T(在本例中为 double)。所以它看起来像这样:
static void Main(string[] args)
{
ValueManipulator<double> doubleManipulator = new ValueManipulator<double>();
doubleManipulator.Manipulate(ProvideDoubles());
}
private static IEnumerable<DoubleValue> ProvideDoubles()
{
yield return new DoubleValue();
yield return new DoubleValue();
yield return new DoubleValue();
}
我如何制作 ValueManipulator,这样用户就不需要知道值实现中使用了什么类型?
【问题讨论】:
-
你可以简化你的循环
int i = 1; foreach(var first in pool) { foreach(var second in pool.Skip(i)) {....} i++;}