C# 如何将带有拆分字符串的列表转换为可能的值集?
我需要实现一个模块,它将一个包含拆分字符串值的列表转换为一个可能的值集 比如说 假设该列表包含以下值C# 如何将带有拆分字符串的列表转换为可能的值集?,c#,list,C#,List,我需要实现一个模块,它将一个包含拆分字符串值的列表转换为一个可能的值集 比如说 假设该列表包含以下值 1 1,2 3 4 5 模块应将上述列表转换为可能的值集列表 1,2,3,4,5 1,1,3,4,5 提前感谢这样就可以了,尽管它会以相反的顺序返回您的示例: static IEnumerable<string> Permutations( IEnumerable<string> input, char separator) { var sep
1
1,2
3
4
5
模块应将上述列表转换为可能的值集列表
1,2,3,4,5
1,1,3,4,5
提前感谢这样就可以了,尽管它会以相反的顺序返回您的示例:
static IEnumerable<string> Permutations(
IEnumerable<string> input,
char separator)
{
var sepAsString = separator.ToString();
var enumerators = input
.Select(s => s.Split(separator).GetEnumerator())
.ToArray();
if (!enumerators.All(e => e.MoveNext())) yield break;
while (true)
{
yield return String.Join(sepAsString, enumerators.Select(e => e.Current));
if (enumerators.Reverse().All(e => {
bool finished = !e.MoveNext();
if (finished)
{
e.Reset();
e.MoveNext();
}
return finished;
}))
yield break;
}
}
罗琳的答案相当可靠,但我觉得它不容易阅读和理解。还有一种方法,使用更少的Linq
private List<string> Process(IEnumerable<string> input)
{
List<string> data = new List<string>();
int preExpandCount = 0, offset = 0;
foreach (string inputItem in input)
{
List<string> splitItems = inputItem.Split(',').ToList();
if (data.Count > 0)
preExpandCount = ExpandList(data, splitItems.Count - 1);
offset = 0;
foreach (string splitItem in splitItems)
{
if (preExpandCount == 0)
data.Add(splitItem);
else
{
for (int i = 0; i < preExpandCount; i++)
data[i + offset] = String.Format("{0},{1}", data[i + offset], splitItem);
offset += preExpandCount;
}
}
}
return data.OrderBy(e => e).ToList();
}
private int ExpandList(List<string> existing, int count)
{
int existingCount = existing.Count;
for (int i = 0; i < count; i++)
existing.AddRange(existing.Take(existingCount).ToList());
return existingCount;
}
私有列表进程(IEnumerable输入)
{
列表数据=新列表();
int preExpandCount=0,offset=0;
foreach(输入中的字符串inputItem)
{
List splitItems=inputItem.Split(',').ToList();
如果(data.Count>0)
preExpandCount=ExpandList(数据,splitItems.Count-1);
偏移量=0;
foreach(splitItems中的字符串splitItem)
{
如果(preExpandCount==0)
数据。添加(拆分项);
其他的
{
对于(int i=0;ie.ToList();
}
私有整数扩展列表(现有列表,整数计数)
{
int existingCount=existing.Count;
for(int i=0;i
private List<string> Process(IEnumerable<string> input)
{
List<string> data = new List<string>();
int preExpandCount = 0, offset = 0;
foreach (string inputItem in input)
{
List<string> splitItems = inputItem.Split(',').ToList();
if (data.Count > 0)
preExpandCount = ExpandList(data, splitItems.Count - 1);
offset = 0;
foreach (string splitItem in splitItems)
{
if (preExpandCount == 0)
data.Add(splitItem);
else
{
for (int i = 0; i < preExpandCount; i++)
data[i + offset] = String.Format("{0},{1}", data[i + offset], splitItem);
offset += preExpandCount;
}
}
}
return data.OrderBy(e => e).ToList();
}
private int ExpandList(List<string> existing, int count)
{
int existingCount = existing.Count;
for (int i = 0; i < count; i++)
existing.AddRange(existing.Take(existingCount).ToList());
return existingCount;
}