C#从Object数组中只选择几个成员对并将其存储在Dictionary中

时间:2017-08-10 09:47:56

标签: c# arrays linq object

我的类(Item)的Object数组如下,

class Item
{
    int id;
    int value;
    bool isSelected;
}

Item itemArr[] = new Item [MAXCOUNT];   

要检索所选的项ID并存储到列表中,我使用下面的代码

List<int> listOfItems = new List<int>();
listOfItems.AddRange(itemArr.Where(p => (p.IsSelected)
                            .Select(p => p.ID)).ToArray());

我还有一个词典,表示项目ID为键,项目值为值,

Dictionary<int,int> itemidValueMap = new Dictionary<int,int>();

如何获取项目ID和值对并将其存储到此字典中?

这个问题不重复。我只需要选择满足条件的元素并将它们只存储在字典中。但之前的问题是关于将所有元素添加到字典中。

3 个答案:

答案 0 :(得分:2)

要构建字典,请使用ToDictionary

var dictionary = itemArr.Where(p => p.IsSelected)
                        .ToDictionary(key => key.id, value => value.value);

如果您有相同的id几次会导致异常(密钥不是唯一的),请使用ToLookup或先GroupBy然后{{1} }。

ToDictionary

作为旁注,您可以更好地填充ID列表:

var lookup = itemArr.Where(p => p.IsSelected)
                    .ToLookup(key => key.id, value => value.value);

var dictionary = itemArr.Where(p => p.IsSelected)
                        .GroupBy(i => i.id)
                        .ToDictionary(key => key.Key, value => value.Select(i => i.value));

答案 1 :(得分:2)

要获取所选ID,您的查询应如下所示:

List<int> selectedIDs = itemArr.Where(item => item.IsSelected).Select(item => item.id).ToList();

请注意,结果是List<int>,而不是List<Item>

要获取字典,请尝试:

var idToValue = itemArr.ToDictionary(item => item.id, item => item.value);

仅当您的ID 唯一时才有效。如果不是,您需要对它们进行分组,但我不知道您希望如何汇总具有相同ID的项目的值。

如果您只想为所选项目添加该词典,只需再次插入Where子句:

var idToValue = itemArr.Where(item => item.IsSelected).ToDictionary(item => item.id, item => item.value);

答案 2 :(得分:1)

您需要更改此

listOfItems.AddRange(itemArr.Where
                  (p => (p.IsSelected).Select(p => p.ID)).ToArray());

listOfItems.AddRange(itemArr.Where
                  (p => p.IsSelected).ToArray());

然后

Dictionary<int,int> itemidValueMap = listOfItems.ToDictionary(item => item.id,
                                   item => item.value)