获取数组中项目的所有组合
本文关键字:组合 项目 数组 获取 | 更新日期: 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);
}