我想写一个函数,它将一个字母数组作为参数,并选择一些字母.
假设您提供了8个字母的数组,并希望从中选择3个字母.然后你应该得到:
8! / ((8 - 3)! * 3!) = 56
Run Code Online (Sandbox Code Playgroud)
数组(或单词)返回,每个包含3个字母.
是否有一种常见的方法将单个类型的项传递给T需要IEnumerable<T>参数的方法 ?语言是C#,框架版本2.0.
目前我正在使用一个辅助方法(它是.Net 2.0,所以我有一大堆类似于LINQ的转换/投射辅助方法),但这看起来很愚蠢:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
其他方式当然是创建和填充a List<T>或an Array而不是传递它IEnumerable<T>.
[编辑]作为扩展方法,它可能被命名为:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
[Edit2]我们发现someObject.Yield()(正如@Peter在下面的评论中所建议的那样)是这个扩展方法的最佳名称,主要是为了简洁,所以如果有人想要抓住它的话,它会与XML注释一起:
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// consisting of a …Run Code Online (Sandbox Code Playgroud) 编程访谈中的一个常见任务(不是根据我的访谈经验)是采用字符串或整数并列出每个可能的排列.
有没有这样做的例子和解决这个问题背后的逻辑?
我已经看过一些代码片段,但它们没有得到很好的评论/解释,因此难以理解.
有n个人编号从.1到n.我必须编写一个代码,用于生成和打印k这些人的所有不同组合n.请解释用于此的算法.
我正在寻找一种有效的方法来实现这一目标:
你有一个数字列表1 ..... n(通常:1..5或1..7左右 - 相当小,但可能因情况而异)
你需要这些数字的所有长度的所有组合,例如只有一个数字({1},{2},...... {n})的所有组合,然后是两个不同数字的所有组合({1,2}, {1,3},{1,4} ..... {n-1,n}),然后是这些数字中的三个的所有组合({1,2,3},{1,2,4})等等
基本上,在组内,顺序是无关紧要的,因此{1,2,3}相当于{1,3,2} - 这只是从该列表获取所有x组数的问题
似乎应该有一个简单的算法 - 但到目前为止我徒劳无功.大多数组合和排列算法似乎a)考虑到顺序(例如123不等于132),并且它们似乎总是在单个字符串或数字上运行....
任何人都有一个伟大的,漂亮的'快速算法?
谢谢!
绝对的心灵空白.那是其中的一天.但我一直在寻找一种解决方案,以获得一定长度的项目列表的独特组合.例如,给定一个列表[a,b,c]和长度为2,它将返回[a,b] [a,c] [b,c]但不返回[b,a] [c,a] [c ,b]的
为此,我发现了许多代码,但似乎没有一个代码.以下代码似乎最合适,我一直在尝试根据我的需要改变它:
// Returns an enumeration of enumerators, one for each permutation
// of the input.
public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list, int count)
{
if (count == 0)
{
yield return new T[0];
}
else
{
int startingElementIndex = 0;
foreach (T startingElement in list)
{
IEnumerable<T> remainingItems = AllExcept(list, startingElementIndex);
foreach (IEnumerable<T> permutationOfRemainder in Permute(remainingItems, count - 1))
{
yield return Concat<T>(
new T[] { startingElement },
permutationOfRemainder);
}
startingElementIndex += 1;
}
} …Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以轻松计算具有特定数量的设置位的所有数字的序列?
例如,我想将所有 2 位数字设置为最多 4 位:
3: has 2 bits set to true
5: ,,
6: ,,
9: ,,
10: ,,
12: ,,
Run Code Online (Sandbox Code Playgroud)
有没有办法在不手动计算位数的情况下确定这些数字?
编辑:数字的顺序并不真正相关。我确实想知道获取所有这些的最快方法,尽管对于特定的位数设置和最大位数。(我不需要可以确定此序列中第 n 个数字的方法)
Edit2:我想要的原因是能够像这里完成的那样获得列表中元素的组合:值列表的所有可能的组合。此解决方案将提供所有组合,其中我只想要具有 8 个唯一值的组合。
这个问题已被多次询问过,但我见过的每个SO帖子都想要一个特定的长度值,而我只是想知道每个独特的组合,无论长度如何.
下面的代码仅提供了一个列表,其中恰好有3个组合条目(并且它们不是唯一的).
List<string> list = new List<string> { "003_PS", "003_DH", "003_HEAT" };
var perms = list.GetPermutations();
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> GetPermutations<T>(this IEnumerable<T> items)
{
foreach (var item in items)
{
var itemAsEnumerable = Enumerable.Repeat(item, 1);
var subSet = items.Except(itemAsEnumerable);
if (!subSet.Any())
{
yield return itemAsEnumerable;
}
else
{
foreach (var sub in items.Except(itemAsEnumerable).GetPermutations())
{
yield return itemAsEnumerable.Union(sub);
}
}
}
}
}
/*
OUTPUT:
003_PS, 003_DH, 003_HEAT
003_PS, 003_HEAT, 003_DH
003_DH, 003_PS, 003_HEAT
003_DH, 003_HEAT, 003_PS …Run Code Online (Sandbox Code Playgroud) algorithm ×6
c# ×6
combinations ×3
math ×2
permutation ×2
.net ×1
binary ×1
c++ ×1
generics ×1
iec10967 ×1
ienumerable ×1