在C#中,是否可以向集合添加值,同时将其分配给另一个变量

在C#中,是否可以向集合添加值,同时将其分配给另一个变量,c#,C#,我使用条件运算符检查某个值是否已缓存在集合中,如果未缓存,请按如下方式调用相应的方法: facilityQuantity = facilityFundedAmts.ContainsKey(facilityId) ? facilityFundedAmts[facilityId] : facilityHolding.Funded(); 是否可以以某种方式将facilityHolding.Fundered()添加到我的FacilityFundDams集合的同一行中?使用扩展方法来封装您正在做的事情怎

我使用条件运算符检查某个值是否已缓存在集合中,如果未缓存,请按如下方式调用相应的方法:

facilityQuantity = facilityFundedAmts.ContainsKey(facilityId) ? facilityFundedAmts[facilityId] : facilityHolding.Funded();

是否可以以某种方式将
facilityHolding.Fundered()
添加到我的
FacilityFundDams
集合的同一行中?

使用扩展方法来封装您正在做的事情怎么样?您可以向其传递键和一个函数,如果该键不存在,则可以使用该函数创建值:

public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, Func<TValue> valueFunc)
{
    TValue value;

    if (!source.TryGetValue(key, out value))
    {
        value = valueFunc();
        source.Add(key, value);
    }

    return value;
}
if (!facilityFundedAmts.TryGetValue(facilityId, out facilityQuantity)) {
  facilityFundedAmts.Add(facilityQuantity = facilityHolding.Funded());
}
正如注释中指出的,有一个从方法组到
Func
的隐式转换,因此您也可以这样写:

facilityQuantity = facilityFundedAmts.GetOrAdd(facilityId, facilityHolding.Funded);

您可以将其作为单个语句编写,但这涉及将条件运算符误用为
if。。。else
语句/表达式:

facilityFundedAmts.ContainsKey(facilityId) ? facilityQuantity = facilityFundedAmts[facilityId] : facilityFundedAmts.Add(facilityQuantity = facilityHolding.Funded());
如果项目存在,则可以使用
TryGetValue
仅访问一次,如果项目不存在,则可以添加:

public static TValue GetOrAdd<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key, Func<TValue> valueFunc)
{
    TValue value;

    if (!source.TryGetValue(key, out value))
    {
        value = valueFunc();
        source.Add(key, value);
    }

    return value;
}
if (!facilityFundedAmts.TryGetValue(facilityId, out facilityQuantity)) {
  facilityFundedAmts.Add(facilityQuantity = facilityHolding.Funded());
}
是否可以以某种方式将facilityHolding.Funded()添加到同一行中的FacilityFundDams集合中

当然可以:

分配给索引属性(如
facilityFundedAmts[]
)被视为一个表达式,因此将其分配给某个对象将应用getter

如果getter很贵,(我假设您使用的是
字典
,其中getter不贵,但仍然…),那么这也会很贵,这意味着:

if(facilityFundedAmts.ContainsKey(facilityId))
  facilityQuantity = facilityFundedAmts[facilityId]
else
  facilityFundedAmts[facilityId] = facilityQuantity = facilityHolding.Funded();
效率略高。它真的不值得费心(它对于任何半体面的集合来说都是真的边缘化的),只是它代表了一个例子,说明源代码中的一行并不一定意味着生成的代码中效率最高

现在,我说

if(!facilityFundedAmts.TryGetValue(facilityId, out facilityQuantity)) facilityFundedAmts.Add(facilityId, facilityQuantity = facilityHolding.Funded());

事实上,在这两个方面都比得上。就个人而言,我会考虑把它放在一行上,但风格不好。

在这个特殊的情况下,<代码>(>)>便利化。我将把它作为一个选项添加进去。ConcurrentDictionary类也内置了这个选项。相同的名字,相同的签名。@neilh我的灵感!除非我需要并发性,否则我会使用
字典。@CharlesMager非常感谢。这是我今天学到的新东西。我实现了这个,代码看起来优雅而简洁。这是一个多线程应用程序吗?非常感谢您的洞察力。在离开dev 7年多之后,我又把手弄脏了。你的评论很有用。