从基类列表中查找字典匹配



我有一个非常奇怪的问题。我正在研究一个大项目,并且在数百万行代码之后,我正在实施核心功能。我不允许更改代码的某些部分,似乎我必须尝试这种方式。

我有两个类别为AB。a源自b。

public class B{}
public class A : B{}

我有一个SortedList<string, A>,我需要将SortedList施加到List<B>中。在List<B>上操作,然后再次将列表投入SortedList

例如:

SortedList<string, B> items;
public List<A> GetItems()
{
   return items.Values.Cast<B>().ToList(); //Getting values works
}
public void SetItems(List<B> newItems)
{
    items = CastWithMagic(newItems); //How to make casting work?
}

A项目有2个可能的更改。

  • B上的更改(基类变量(
  • 从列表中删除项目。

我想将List<B>上的更改应用于SortedList<string, A>

项目上有2个可能的更改。

  • B(基类变量(上的更改
  • 从列表中删除项目。

对象的更改将反映在两个列表中,因为列表仅包含引用到同一对象。因此,您需要处理的只是从List中删除的对象。我相信您必须循环浏览排序的列表,以查看是否已从列表中删除对象:

public void SetItems(List<B> newItems)
{
    foreach(string key in items.Keys)
    {
        if(!newItems.Contains(items[key] as B))
            items.Remove(key);
    }
}

请注意,这是效率降低的,因为您正在循环浏览两个集合,使其成为O(m*n)-如果您的收藏很小并且性能并不重要,那么您可能还可以,但是从此开始,然后找到使其更有效的方法(也许从源集合而不是复制列表中删除?(

您可能能够为此使用Linq的'Select'函数。以此示例代码:

private void test()
{
    List<alphaClass> firstList = new List<alphaClass>();
    List<betaClass> secondList = firstList.Select(z => (betaClass)z).ToList();
}
public class alphaClass { }
public class betaClass : alphaClass { }

(这假定列表中的所有内容都可以作为派生类。(

无论如何,Linq的选择语句可用于将IEnumerable转换为其他形式。在这种情况下,将其从一个类转换为另一个类。


编辑:whops-错过了排序的列表部分。可以通过使用扩展方法来解决这个问题:

public static class ExtensionMethod
{
    public static SortedList<TKey, TValue> ToSortedList<TSource, TKey, TValue>
(this IEnumerable<TSource> source,
 Func<TSource, TKey> keySelector,
 Func<TSource, TValue> valueSelector)
    {
        var ret = new SortedList<TKey, TValue>();
        foreach (var element in source)
        {
            ret.Add(keySelector(element), valueSelector(element));
        }
        return ret;
    }
}

...然后,从这里,您可以使用这样的扩展名:

SortedList<string, betaClass> myList = new SortedList<string, betaClass>();
SortedList<string, alphaClass> secondList;
secondList = myList.ToSortedList(kvp => kvp.Key, kvp => (alphaClass) kvp.Value);

最新更新