如果条件转换为每个字典值并将关键字添加到列表

时间:2020-10-28 08:22:30

标签: c# linq

我可以将以下语句转换为LINQ吗?

Dictionary<Guid, Guid> BatchID_To_RunID = new Dictionary<Guid, Guid>();
List<Guid> BatchIDList_InCase = new List<Guid>();

foreach (var x in BatchID_To_RunID)
{
    if (x.Value == RunID)
    {
        Guid BatchID = x.Key;
        BatchIDList_InCase.Add(x.Key); 
    }
}

谢谢

3 个答案:

答案 0 :(得分:1)

好吧,if实际上是一个过滤器,建议一个Where调用,而x.Key的使用实际上是一个投影,建议一个Select调用。因此,假设BatchIDList_InCase在此循环之前为空,则可以将其替换为:

// TODO: Rename BatchID_To_RunID to follow .NET naming conventions
var batchIds = BatchID_To_RunID
    .Where(pair => pair.Value == RunID)
    .Select(pair => pair.Key)
    .ToList();

或使用查询表达式:

var batchIds = (from pair in BatchID_To_RunID where pair.Value == RunID select pair.Key)
                  .ToList();

答案 1 :(得分:1)

因此,您有一个字典BatchID_To_RunID和一个变量RunId

要求

请给我字典中所有值等于RunId的项的键。

如果您正是这样写的话,解决方案就不是很困难了:

GUID RunId = ...
var result = BatchID_To_RunID         // this is a sequence of KeyValuePair<GUID, GUID>

    // Keep only those KeyValuePairs with a value equal to RunId
    .Where(keyValuePair => keyValuePair.Value == RunId)

    // from the remaining keyValuePairs, Select the Key
    .Select(keyValuepair => keyValuePair.Key)

    // and convert this sequence of GUIDs into a List:
    .ToList();

简单的漫画卓悦!

答案 2 :(得分:0)

这是一种实现方法:

 BatchIDList_InCase.AddRange(BatchID_To_RunID.Where(b => b.Value == RunID).Select(b => b.Key).ToList());