-3

我的应用程序中有以下遗留代码,并希望对其进行优化。arrayOfAttrValue具有独特的属性。我可以使用 LINQ 来实现循环优化吗?如果是这样,那么你能告诉我怎么做吗?

foreach (AttrValue attr in arrayOfAttrValue)
{
    switch(attr.Attribute)
    {
        case Constants.Gender
            mymodel.Gender = attr.Value;
            break;
        case Constants.Identifier
            mymodel.AppIdentifier = attr.Value;
            break;
    }
}

我的意图不一定是只使用 LINQ。任何其他减少循环的方法也会有所帮助。

谢谢。

4

3 回答 3

1

不,你不能在“真正的”LINQ 中这样做,因为 LINQ 是关于从旧对象生成新对象。这mymodel是您要修改的预先存在的对象。

您可以使用Array.ForEachList.ForEach

  1. 它们不是“真正的”LINQ 和

  2. 生成的代码将是等效的(因为会有委托而慢一点)

尽管如此,downvoter 可能想要一些 LINQ,所以我会给出一些 LINQ:

arrayOfAttrValue.All(attr => {
    mymodel.Gender = attr.Attribute == Constants.Gender ? attr.Value : mymodel.Gender;
    mymodel.AppIdentifier = attr.Attribute == Constants.Identifier ? attr.Value : mymodel.AppIdentifier;
    return true;
});

少一行,忽略{}行。

于 2013-08-19T10:17:22.713 回答
1

您有属性列表,它们代表键值对。保存这种数据结构的自然方法是字典。因此,将您的输入数据格式转换为字典:

var attributes = arrrayOfAttrValue.ToDictionary(a => a.Attribute, a => a.Value);

或者,如果每个属性在您的数组中不是唯一的,则创建字典会更加困难,但这就是您拥有的数据格式。为了使您的数据更容易处理,您应该将它们转换为方便的格式:

var attributes = arrayOfAttrValue
                   .GroupBy(a => a.Attribute)                
                   .ToDictionary(g => g.Key, g => g.Select(a => a.Value).Last());

创建属性字典后,您可以简单地检查您是否具有属性值并将该值分配给模型属性。属性检索现在对任何读者来说都简单明了:

if (attributes.ContainsKey(Constants.Gender))
    model.Gender = attributes[Constants.Gender];

if (attributes.ContainsKey(Constants.Identifier))
    model.AppIdentifier = attributes[Constants.Identifier];   
于 2013-08-19T10:22:51.410 回答
1

无需在代码中手动执行循环,您可以简单地使用.LastOrDefault()

mymodel.Gender = arrayOfAttrValue
    .Where(attr => attr.Attribute == Constants.Gender)
    .Select(attr => attr.Value).LastOrDefault() ?? mymodel.Gender;
mymodel.AppIdentifier = arrayOfAttrValue
    .Where(attr => attr.Attribute == Constants.Identifier)
    .Select(attr => attr.Value).LastOrDefault() ?? mymodel.AppIdentifier;

?? mymodel.Gender确保我们没有将它设置为( Default(T)ie null) 在以前设置为其他值的情况下。然后,这与您最初问题的功能逻辑相匹配。

这样做可以很清楚你想要做什么。当然,这种方法意味着您在数组上循环两次,但是如果您的数组实际上是一个数组,那么这种性能成本将非常小。

如果您仍然对此有性能问题,那么您可能需要考虑使用比 a 更好的数据结构arrayOfAttrValue(可以通过索引访问的东西,Attribute例如 a Dictionary<,>)。

于 2013-08-19T10:55:34.570 回答