避免在C#中进行多个函数调用

Chi*_*rac 22 c#

目前用C#编码,我想知道是否有一种方法可以将代码考虑在内,如下所示

Entity1 = GetByName("EntityName1");
Entity2 = GetByName("EntityName2");
Entity3 = GetByName("EntityName3");
Run Code Online (Sandbox Code Playgroud)

我们的想法是在代码中进行单个调用,通过将entitiesstrings放在容器中并在此容器上迭代以获得单个" 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)

  • 那么,为什么不首先使用`Dictionary <string,Entity>`,如果它们彼此依赖很多呢?然后方法`GetByName`,集合`names`和`entities`以及这个LINQ查询是多余的. (7认同)

Rag*_*lly 10

你的意思是这样的下面(其中entities是收集Entity1,Entity1&Entity3):

var results = entities.Select(e => GetByName(e.Name));
Run Code Online (Sandbox Code Playgroud)


Mat*_*gen 7

这取决于你在寻找什么.如果您需要在一行中设置变量,那将无效.如果你正在处理字段或属性,你可以玩反射,但老实说,这似乎比你已经得到的更混乱.

如果数据结构无关紧要,并且您只需要数据并且能够在您认为合适时使用它,我可能会将其枚举为字典.当然,这与你现在所拥有的非常紧密相关,无论如何它看起来都是假的.

如果你想这样做,那就非常简单了.您可以选择如何创建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)

但实际上,很难知道这是否比你已经拥有的更好.