You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Linq将IUIAutomationElementArray转换为NumberRectangle的ArrayList

使用LINQ将IUIAutomationElementArray转换为NumberRectangle

嘿,这个需求用LINQ来实现完全没问题,我给你梳理下具体的实现思路和代码示例,帮你把迭代逻辑改成更简洁的声明式写法。

核心思路

首先要明确:IUIAutomationElementArray本身并没有实现IEnumerable<T>接口,所以不能直接用LINQ的Select方法。我们需要先把它转换成可枚举的IUIAutomationElement序列,再通过LINQ的映射操作将每个元素转换为NumberRectangle。

代码实现

1. 将IUIAutomationElementArray转为可枚举序列

我们可以用Enumerable.Range遍历数组的索引,逐个取出IUIAutomationElement:

// 假设automationElementArray是你的IUIAutomationElementArray实例
var uiElements = Enumerable.Range(0, automationElementArray.Length)
                           .Select(index => automationElementArray.GetElement(index));

2. 映射为NumberRectangle

接下来,针对每个IUIAutomationElement,提取你已缓存的边界矩形数据,实例化并配置NumberRectangle:

var numberRectangles = uiElements
    .Select(element => 
    {
        // 提取已缓存的边界矩形(这里根据你实际的缓存获取方式调整,比如GetCachedPropertyValue)
        var cachedBounds = element.GetCachedBoundingRectangle();
        
        // 实例化NumberRectangle并设置边界属性
        var numRect = new NumberRectangle();
        // 假设NumberRectangle用自定义的Rect属性存储边界,或者用Border的布局属性调整
        numRect.Rect = new Rect(
            cachedBounds.Left, 
            cachedBounds.Top, 
            cachedBounds.Width, 
            cachedBounds.Height
        );
        
        // 如果需要从IUIAutomationElement提取其他缓存数据,也可以在这里补充
        return numRect;
    })
    .ToList(); // 转为List<NumberRectangle>,按需选择是否保留IEnumerable

3. 可选:利用IComparable排序

因为NumberRectangle实现了IComparable接口,如果你需要对转换后的集合排序,直接追加OrderBy即可:

var sortedNumberRectangles = numberRectangles.OrderBy(rect => rect).ToList();

4. 优化:抽离转换逻辑(可选)

如果转换逻辑比较复杂,建议把它抽成单独的方法,让LINQ代码更清晰:

private NumberRectangle ConvertToNumberRectangle(IUIAutomationElement uiElement)
{
    var cachedBounds = uiElement.GetCachedBoundingRectangle();
    var numRect = new NumberRectangle();
    numRect.Rect = new Rect(cachedBounds.Left, cachedBounds.Top, cachedBounds.Width, cachedBounds.Height);
    
    // 其他转换逻辑,比如设置NumberRectangle的其他属性
    return numRect;
}

// 调用时的LINQ代码
var numberRectangles = Enumerable.Range(0, automationElementArray.Length)
                                 .Select(i => automationElementArray.GetElement(i))
                                 .Select(ConvertToNumberRectangle)
                                 .ToList();

注意事项

  • 注意COM对象的资源管理:IUIAutomationElement是COM对象,大量处理时要确保及时释放(如果你的环境没有自动回收的话),不过LINQ本身不会影响这一点,和迭代方式的资源处理逻辑一致。
  • 确保缓存数据已正确加载:转换前要确认每个IUIAutomationElement的边界矩形缓存已经完成,避免运行时获取不到缓存数据的问题。

内容的提问来源于stack exchange,提问作者Rachel 674

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:05:19