Convert/Parse 许多对象使用代码较少的成员方法
Convert/Parse many Objects using a member Method with less Code
有没有简单的方法convert/parseClassFoo
的许多对象到classBar
的对象,使用[=]的成员方法31=] Bar
喜欢 Bar.loadFromFooObject(Foo classFoo)
?
所以如果我有那 2 个 Classes:
class Foo
{
public string var1;
public int var2;
public List<string> var3;
}
class Bar
{
public string var1;
public int var2;
public float var4;
public void loadFromFooObject(Foo fooObj)
{
this.var1 = fooObj.var1;
this.var2 = fooObj.var2;
}
}
这样我就可以避免做:
Foo[] fooObjs = { new Foo(), new Foo(), new Foo()};
Bar[] barObjs = new Bar[fooObjs.Length];
for (int i = 0; i < fooObjs.Length; i++)
{
barObjs[i].loadFromFooObject(fooObjs[i]);
}
然后做类似的事情:
Foo[] fooObjs = { new Foo(), new Foo(), new Foo()};
Bar[] barObjs = fooObjs.Parse(loadFromFooObject);
是否可以使用 C# and/or Linq 实现类似的功能?
类似这样,您只需要创建一个 ConvertToBar 方法,该方法接受一个 Foo 和 returns 一个 Bar。
var barObjs = fooObjs.Select(i=>ConvertToBar(i)).ToArray();
写一个方法TransformFooToBar
然后使用linq,例如
var barObjs = fooObjs.Select(n => TransformFooToBar(n)).ToArray();
如果你真的想让它成为Bar
class上的一个方法,写一个扩展方法,然后linq是这样的:
var barObjs = fooObjs.Select(n => n.TransformFooToBar()).ToArray();
我的偏好(这只是个人偏好)是覆盖显式强制转换运算符,只从一种类型强制转换为另一种类型。将其与 Kye 的答案结合起来处理多个对象。
我对任何类型的对象都经常使用这种策略conversion/mapping:
- 为单个对象转换创建函数
- 创建一个接受
IEnumerable
的重载(对我来说通常是一个列表)并使用 LINQ .Select
to convert the entire list into. It codes seamlessly since the single object conversion is, by definition, a Func
. See this SO answer 获得关于 Func
的更多解释。
您还可以通过在静态 class 中创建一些扩展方法来了解扩展方法。对于您的具体情况,扩展方法可能如下所示:
public static class ExtensionMethods
{
public static Bar ToBar(this Foo foo)
{
var bar = new Bar();
bar.loadFromFooObject(foo);
//you could also move the logic to convert from the Bar class in here
return bar;
}
//Overload for a collection of Foos (like Foo[] or List<Foo>)
public static IEnumerable<Bar> ToBars(this IEnumerable<Foo> foos)
{
//Since ToBar is a Func<Foo, Bar>
return foos.Select(ToBar);
//alternate lambda syntax: return foos.Select(foo => foo.ToBar());
}
}
您可以这样调用这些方法:
var fooList = new List<Foo>();
var barEnumerable = fooList.ToBars();
有没有简单的方法convert/parseClassFoo
的许多对象到classBar
的对象,使用[=]的成员方法31=] Bar
喜欢 Bar.loadFromFooObject(Foo classFoo)
?
所以如果我有那 2 个 Classes:
class Foo
{
public string var1;
public int var2;
public List<string> var3;
}
class Bar
{
public string var1;
public int var2;
public float var4;
public void loadFromFooObject(Foo fooObj)
{
this.var1 = fooObj.var1;
this.var2 = fooObj.var2;
}
}
这样我就可以避免做:
Foo[] fooObjs = { new Foo(), new Foo(), new Foo()};
Bar[] barObjs = new Bar[fooObjs.Length];
for (int i = 0; i < fooObjs.Length; i++)
{
barObjs[i].loadFromFooObject(fooObjs[i]);
}
然后做类似的事情:
Foo[] fooObjs = { new Foo(), new Foo(), new Foo()};
Bar[] barObjs = fooObjs.Parse(loadFromFooObject);
是否可以使用 C# and/or Linq 实现类似的功能?
类似这样,您只需要创建一个 ConvertToBar 方法,该方法接受一个 Foo 和 returns 一个 Bar。
var barObjs = fooObjs.Select(i=>ConvertToBar(i)).ToArray();
写一个方法TransformFooToBar
然后使用linq,例如
var barObjs = fooObjs.Select(n => TransformFooToBar(n)).ToArray();
如果你真的想让它成为Bar
class上的一个方法,写一个扩展方法,然后linq是这样的:
var barObjs = fooObjs.Select(n => n.TransformFooToBar()).ToArray();
我的偏好(这只是个人偏好)是覆盖显式强制转换运算符,只从一种类型强制转换为另一种类型。将其与 Kye 的答案结合起来处理多个对象。
我对任何类型的对象都经常使用这种策略conversion/mapping:
- 为单个对象转换创建函数
- 创建一个接受
IEnumerable
的重载(对我来说通常是一个列表)并使用 LINQ.Select
to convert the entire list into. It codes seamlessly since the single object conversion is, by definition, aFunc
. See this SO answer 获得关于Func
的更多解释。
您还可以通过在静态 class 中创建一些扩展方法来了解扩展方法。对于您的具体情况,扩展方法可能如下所示:
public static class ExtensionMethods
{
public static Bar ToBar(this Foo foo)
{
var bar = new Bar();
bar.loadFromFooObject(foo);
//you could also move the logic to convert from the Bar class in here
return bar;
}
//Overload for a collection of Foos (like Foo[] or List<Foo>)
public static IEnumerable<Bar> ToBars(this IEnumerable<Foo> foos)
{
//Since ToBar is a Func<Foo, Bar>
return foos.Select(ToBar);
//alternate lambda syntax: return foos.Select(foo => foo.ToBar());
}
}
您可以这样调用这些方法:
var fooList = new List<Foo>();
var barEnumerable = fooList.ToBars();