目前用C#编码,我想知道是否有一种方法可以将代码考虑在内,如下所示
Entity1 = GetByName("EntityName1");
Entity2 = GetByName("EntityName2");
Entity3 = GetByName("EntityName3");
Run Code Online (Sandbox Code Playgroud)
我们的想法是在代码中进行单个调用,通过将entities和strings放在容器中并在此容器上迭代以获得单个" GetByName()"行来分解代码.有没有办法做到这一点?
Pan*_*vos 27
您可以使用LINQ:
var names=new[]{"EntityName1","EntityName2","EntityName3",.....};
var entities=names.Select(name=>GetByName(name)).ToArray();
Run Code Online (Sandbox Code Playgroud)
如果没有ToArray,Select将返回一个IEnumerable,每当你枚举它时它将被重新评估 - 也就是说,GetByName每次枚举可枚举时都会调用它.
ToArray()或者ToList将创建一个可以多次使用的数组(或列表).
ToDictionary如果您希望能够按名称访问实体,也可以调用:
var entities=names.ToDictionary(name=>name,name=>GetByName(name));
Run Code Online (Sandbox Code Playgroud)
所有这些都假设实体尚未存在或者GetByName必须执行一些重要工作来检索它们.如果实体存在,您可以简单地将它们放入Dictionary<String,Entity>.如果实体具有Name属性,则可以使用ToDictionary在一个语句中创建字典:
var entities=new []{entity1,entity2,entity3,...};
var entitiesDict=entities.ToDictionary(entity=>entity.Name,entity=>entity);
Run Code Online (Sandbox Code Playgroud)
Rag*_*lly 10
你的意思是这样的下面(其中entities是收集Entity1,Entity1&Entity3):
var results = entities.Select(e => GetByName(e.Name));
Run Code Online (Sandbox Code Playgroud)
这取决于你在寻找什么.如果您需要在一行中设置变量,那将无效.如果你正在处理字段或属性,你可以玩反射,但老实说,这似乎比你已经得到的更混乱.
如果数据结构无关紧要,并且您只需要数据并且能够在您认为合适时使用它,我可能会将其枚举为字典.当然,这与你现在所拥有的非常紧密相关,无论如何它看起来都是假的.
如果你想这样做,那就非常简单了.您可以选择如何创建IEnumerable<string>下面所示的内容entityNames.您可以像我一样使用数组初始化程序,您可以使用List<string>随时间构建的数组,甚至可以使用yield return自己的方法.
var entityNames = new[] { "EntityName1", "EntityName2", "EntityName3" };
var dict = entityNames.ToDictionary(c => c, c => GetByName(c));
Run Code Online (Sandbox Code Playgroud)
那只是检查那些问题.
var entity1 = dict["EntityName1"];
Run Code Online (Sandbox Code Playgroud)
或者列举字典.
foreach(var kvp in dict)
{
Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value);
}
Run Code Online (Sandbox Code Playgroud)
但实际上,很难知道这是否比你已经拥有的更好.