在列表列表中获取自定义对象T<;T>;基于密钥

本文关键字:列表 于密钥 密钥 lt 获取 自定义 对象 gt | 更新日期: 2023-09-27 18:26:23

我有一个我称之为Actions的列表,看起来像这个

public class Actions
{
        public string Type { get; set; }
        public string Observations { get; set; }
        public Actions(
            string type,
            string observations)
        {
            Type = type;
            observations= type;
        }
}

我后来在类似List<Actions> data= new List<Actions>(); 的列表中使用

这份列表将列出鸟类的类型以及观察它们的时间。这些数据来自我一个接一个读取的文件。因此,在循环中,我可能会找到Eagle, 1,这意味着我必须在该列表中找到具有type==Eagle的对象,并向其observations键添加+1。

当然,我可以迭代这个列表,检查它的第i个对象的type键是否具有我想要的值,并递增它的observations

有人知道做我追求的事情的更好方法吗?

在列表列表中获取自定义对象T<;T>;基于密钥

当然,我可以迭代这个列表,检查它的第I个对象的类型键是否具有我想要的值,并增加它的观察值。

是的,那就行了。

你可以这样做:

var birdToUpdate = birdList.FirstOrDefault(b => b.Type == keyToFind);
if (birdToUpdate == null)
{
    birdToUpdate = new Actions(keyToFind, 0);
    birdList.Add(birdToUpdate);
}
birdToUpdate.Observations++;

如果没有返回,这是对那只鸟的第一次观察,所以你添加它。

然后,如果你想在混合物中添加颜色:

var birdToUpdate = birdList.FirstOrDefault(b => b.Type == keyToFind 
                                             && b.Color == colorToFind);
if (birdToUpdate == null)
{
    birdToUpdate = new Actions(keyToFind, colorToFind, 0);
    birdList.Add(birdToUpdate);
}
birdToUpdate.Observations++;

另一种选择是丢弃这一类的整数,并引入一个Dictionary<string, int>,其中关键是鸟的名字,int是观测次数。

或者,如果你坚持使用这个类,那么请为这个类想出一个合适的名称,并使其成为Dictionary<string, Actions>

伪:

Actions actionForBird;
if (!dictionary.TryGetValue(keyToFind, out actionForBird))
{
    actionForBird = new Actions(keyToFind, 0);
    dictionary[keyToFind] = actionForBird;
}
actionForBird.Observations++;

尝试使用字典使用lambda表达式

示例

var type = 'eagle';
Dictionary<string, int> observations = new Dictionary<string, int>();
var obj = observations.FirstOrDefault(p => p.Key == type);

将用户输入放入var type