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