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

本文关键字:组合 项目 数组 获取 | 更新日期: 2023-09-27 17:57:03

我在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 }));
 }

然后从主方法调用它。

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

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

检查"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和第二:null的原因是因为延迟执行。你的 IEnumerable 对象还不知道它的值是什么,直到你实际尝试使用这些值,例如 ToList() 或迭代器。

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

        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);
        }