我有这段代码,似乎支持将许多列表参数传递给它,它会将每个参数相互比较,以便同时在所有其他列表中找到一个公共列表。
我无法弄清楚如何将多个列表传递给一个IEnmerable的单个参数。
说我的测试代码看起来像这样
List<uint> List1 = new List<uint>();
List<uint> List2 = new List<uint>();
List<uint> List3 = new List<uint>();
List<uint> Commons = FindCommon(List1, List2, List3); //no compile
List<uint> Commons = FindCommon<List<uint>>(List1, List2, List3); //no compile?? why
我该怎么称呼?我必须以某种方式将它们合并到IEnumerable中吗?或者我必须以某种方式将它们全部合并到一个列表中,同时保留某种不可见的分隔符?
static List<T> FindCommon<T>(IEnumerable<List<T>> lists)
{
Dictionary<T, int> map = new Dictionary<T, int>();
int listCount = 0; // number of lists
foreach (IEnumerable<T> list in lists)
{
listCount++;
foreach (T item in list)
{
// Item encountered, increment count
int currCount;
if (!map.TryGetValue(item, out currCount))
currCount = 0;
currCount++;
map[item] = currCount;
}
}
List<T> result= new List<T>();
foreach (KeyValuePair<T,int> kvp in map)
{
// Items whose occurrence count is equal to the number of lists are common to all the lists
if (kvp.Value == listCount)
result.Add(kvp.Key);
}
return result;
}
PS&gt; FindCommon在某种程度上被破坏了它没有正常工作,可能并不是我认为应该做的事情......它没有检查所有列表同时只有一个列表一次只列出一个列表,而另一个列表打破了它的目的,它将它们计算在内......但它并没有跟踪它们来自哪个列表。
修正如此,这种方法按预期工作。
public static List<T> FindCommon<T>(params List<T>[] lists)
{
SortedDictionary<T, bool>
current_common = new SortedDictionary<T, bool>(),
common = new SortedDictionary<T, bool>();
foreach (List<T> list in lists)
{
if (current_common.Count == 0)
{
foreach (T item in list)
{
common[item] = true;
}
}
else
{
foreach (T item in list)
{
if (current_common.ContainsKey(item))
{
common[item] = true;
}
}
}
if (common.Count == 0)
{
current_common.Clear();
break;
}
SortedDictionary<T, bool>
swap = current_common;
current_common = common;
common = swap;
common.Clear();
}
return new List<T>(current_common.Keys);
}
答案 0 :(得分:7)
您可以使用params
关键字很好地完成此操作。在您的示例中:
static List<T> FindCommon<T>(params List<T>[] lists)
那将实现用法:
List<uint> Commons = FindCommon(List1, List2, List3);
答案 1 :(得分:1)
您需要在另一个列表中添加list1,list2,list3,例如
List<List<uint>> commonLists=new List<List<uint>>();
commonLists.Add(list1);
commonLists.Add(list2);
commonLists.Add(list3);
List<uint> commons=FindCommon<List<unit>>(commonLists);