如何将多个对象传递到IEnumerable列表?

时间:2016-01-22 10:06:38

标签: c# .net vb.net list

我有这段代码,似乎支持将许多列表参数传递给它,它会将每个参数相互比较,以便同时在所有其他列表中找到一个公共列表。

我无法弄清楚如何将多个列表传递给一个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);
}

2 个答案:

答案 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);