获取数组中项目的所有组合

时间:2014-04-06 13:26:23

标签: c#

我在f1.txt,f2.txt,....f15.txt等文件夹中有文本文件。我想得到长度为2的组合。

最终结果应为

{f1.txt, f2.txt}, {f1.txt, f3.txt}....

我使用了代码

 static IEnumerable<IEnumerable<T>>
 GetKCombs<T>(IEnumerable<T> list, int length) where T : IComparable
 {
        if (length == 1) return list.Select(t => new T[] { t });
        return GetKCombs(list, length - 1)
            .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) > 0),
                (t1, t2) => t1.Concat(new T[] { t2 }));
 }

然后从main方法调用它。

string[] files = Directory.GetFiles(@"C:\Users\Downloads\Samples", "*.txt");
IEnumerable<IEnumerable<string>> filescombination = GetKCombs(files, 2);

但为什么我一无所获?

编辑:

        foreach(var x in filescombination)
        {
            Console.WriteLine(x);
        }

在即时窗口中,我们有

?x
          {System.Linq.Enumerable.ConcatIterator<string>}
            first: null
            second: null

2 个答案:

答案 0 :(得分:2)

检查'files'是否包含您期望的文件列表。

该方法按预期工作。在一个小测试应用程序中测试:

class Program
{
    static void Main(string[] args)
    {
        List<int> list = new List<int> { 1, 2, 3, 4 };

        IEnumerable<IEnumerable<int>> result = GetKCombs(list, 2);

        foreach (var line in result)
        {
            foreach (var item in line)
            {
                Console.Write("{0}, ", item);
            }
            Console.WriteLine();
        }

        Console.ReadKey();
    }

    static IEnumerable<IEnumerable<T>> GetKCombs<T>(IEnumerable<T> list, int length) where T : IComparable
    {
        if (length == 1) return list.Select(t => new T[] { t });
        return GetKCombs(list, length - 1)
            .SelectMany(t => list.Where(o => o.CompareTo(t.Last()) > 0),
                (t1, t2) => t1.Concat(new T[] { t2 }));
    }
}

修改

在您的代码中,您有:

    foreach(IEnumerable<string> x in filescombination)
    {
        Console.WriteLine(x);
    }

当您执行Console.WriteLine(x)时,它等同于Console.WriteLine(x.ToString())。 ToString()的默认行为是显示对象的名称。

在调试模式中你得到第一个的原因:null和second:null是因为延迟执行。您的IEnumerable对象尚不知道它的值是什么,直到您实际尝试使用这些值,例如ToList()或迭代器。

答案 1 :(得分:0)

最后我通过代码得到了它。

        foreach(var x in filescombination)
        {
            var y = x.ToList()[0] + ',' + x.ToList()[1];
        }

因为x是

IEnumerable<string>

我们可以得到结果:

        IEnumerable<IEnumerable<string>> filescombination = GetKCombs(files,2);
        List<string> flist = new List<string>();
        foreach(var x in filescombination)
        {
            var y = x.ToList()[0] + ',' + x.ToList()[1];
            flist.Add(y);
        }