基于键的ObservableCollection的整合

本文关键字:ObservableCollection 于键 | 更新日期: 2023-09-27 18:06:59

我刚刚开始,所以如果我没有使用正确的术语,请原谅我。我试图通过循环和比较一个键到集合中的所有其他键来巩固一个ObservableCollection>。如果它们是相同的,那么它应该比较匹配的键值。我没有足够的名气来发照片。

        private void CombineUDAs(ObservableCollection<Tuple<object, object>> UDAs)
        {
            foreach (var item in UDAs)
            {
            }
        }

基于键的ObservableCollection的整合

你可以这样做:

public void CombineUDAs( ObservableCollection<Tuple<object, object>> UDAs )
{
    foreach ( var item in UDAs )
        foreach ( var innerItem in UDAs.Where( innerItem => innerItem != innerItem && item.Item1 == innerItem.Item1 ) )
            Console.WriteLine( "Value is same: {0}", item.Item2 == innerItem.Item2 );
}
  • 遍历每个项目
  • 对于每个项目,在集合中搜索具有相同"键"的项目
  • 检查"values"是否等于

我对我的c#有点生疏,所以我的语法可能是off的,你可能可以做得更干净,但这里有一个粗略的想法…

请注意,内部for循环从外部对象索引开始,因此您不会在重复对象上循环。可能会提高性能。

public void CombineUDAs( ObservableCollection<Tuple<object, object>> UDAs )
   {
       for(outer=0; outer<UDAs.Count; outer++)
          for (inner = outer; inner<UDAs.Count; inner++)
             if(outer != inner && (UDAs[inner].item1 == UDAs[outer].item1) && (UDAs[inner].item2 == UDAs[outer].item2))
                //Add to collection
   }

将重复的元素添加到新集合中可能更容易。如果你经常在新集合中导航,这可能会节省性能,具体取决于集合的大小。

如果你想让其他对象为空,你只需要根据需要反转If语句。可能是这样的:

if(outer != inner && (UDAs[inner].item1 != UDAs[outer].item1) || (UDAs[inner].item2 != UDAs[outer].item2))

在同事的帮助下,以我想要的方式工作,这是结果代码。枚举数是选定的对象。我仍然需要回去收紧代码,但功能是存在的。

    _udaTuple = new ObservableCollection<Tuple<object, object>>();        
    var tempDictionary = new Dictionary<object, object>();
    foreach (var item in Enumerator)
        {
            var modelObject = item as TSM.ModelObject;
            if (modelObject != null)
            {
                var tempHash = new Hashtable();
                modelObject.GetAllUserProperties(ref tempHash);
                foreach (DictionaryEntry dictionaryEntry in tempHash)
                {
                    if (tempDictionary.ContainsKey(dictionaryEntry.Key))
                    {
                        if (tempDictionary[dictionaryEntry.Key] is string && dictionaryEntry.Value is string)
                        {
                            if ((string)tempDictionary[dictionaryEntry.Key]!=(string)dictionaryEntry.Value)
                            {
                                tempDictionary[dictionaryEntry.Key] = "Values Do Not Match";
                            }
                        }
                        else if (tempDictionary[dictionaryEntry.Key] is double && dictionaryEntry.Value is double)
                        {
                            if ((double)tempDictionary[dictionaryEntry.Key] != (double)dictionaryEntry.Value)
                            {
                                tempDictionary[dictionaryEntry.Key] = "Values Do Not Match";
                            }
                        }
                        else if (tempDictionary[dictionaryEntry.Key] is int && dictionaryEntry.Value is int)
                        {
                            if ((int)tempDictionary[dictionaryEntry.Key] != (int)dictionaryEntry.Value)
                            {
                                tempDictionary[dictionaryEntry.Key] = "Values Do Not Match";
                            }
                        }
                    }
                    else
                    {
                        tempDictionary.Add(dictionaryEntry.Key, dictionaryEntry.Value);
                    }
                }
            }
        }
        foreach (var item in tempDictionary)
        {
            _udaTuple.Add(new Tuple<object, object>(item.Key, item.Value));
        }