我有一个非常奇怪的问题。我正在研究一个大项目,并且在数百万行代码之后,我正在实施核心功能。我不允许更改代码的某些部分,似乎我必须尝试这种方式。
我有两个类别为A
和B
。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);