【问题标题】:How to concat multiple list of object in single column c#如何在单列c#中连接多个对象列表
【发布时间】:2021-12-16 16:49:51
【问题描述】:

在单行列中显示多个列表时遇到问题。

这是一个代码示例。

public class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, List<object>> keyvalues = new Dictionary<string, List<object>>();
        keyvalues.Add("Code", new List<object>() { 1, 2, 3, 4 });
        keyvalues.Add("Name", new List<object>() { "A", "B", "C", "D" });
        keyvalues.Add("Age", new List<object>() { 20, 30, 40, 50 });        

        var listData = keyvalues.Select(x => x.Value).Select((x, i) => new { obj = x, index = i });
        var listData = keyvalues.Select((x, iparent) => x.Value.Select((z, i) => new { value = string.Concat(z, x.Value[i]) }).ToList()).ToList();
                
        Console.ReadLine();
    }
}

预期输出

1A20
2B30
3C40
4D50

【问题讨论】:

  • 我不确定列在哪里,但似乎this 可能会回答您的问题。
  • 感谢您的评论,在发布问题时,我看起来相同但无法解决问题,让我再次检查:)。

标签: c# asp.net asp.net-mvc


【解决方案1】:

如果您使用的是 .Net 6,则可以使用新的 3 路 Zip 扩展。

var result = keyvalues["Code"].Zip(keyvalues["Name"], keyvalues["Age"])
            .Select(x=> $"{x.First}{x.Second}{x.Third}");

【讨论】:

  • 谢谢它运行良好,但我在实际问题中做了一个例子key name not fix.
【解决方案2】:

为什么要这么复杂?

for(int x = 0; x<keyValues["Code"].Count; x++)
  Console.WriteLine(
    keyValues["Code"][x]+
    keyValues["Name"][x]+
    keyValues["Age"][x]
  );

LINQ 是一把锤子;不是每个问题都是钉子。

ps 如果你有 N 个键,你可以很容易地把它变成一个

var keys = new[]{"Code","Name","Age","Foo","Bar"};
for(...)
  foreach(var k in keys)
    ... //some concat here or use the values directly eg adding to your page 

【讨论】:

  • 谢谢它工作正常,但我已经在实际问题键名未修复中做了一个示例。
  • 这就是答案底部的“如果你有 N 个键”部分的用途。这些可以来自任何地方,而不仅仅是硬编码。但如果你需要特定的帮助把它放在你的问题中;我们只能回应我们看到的问题
【解决方案3】:

您可以在此处轻松使用Zip。但是,您可以自己滚动

public static IEnumerable<string> DoStuff<T, T2>(Dictionary<T, List<T2>> source)
{
   var max = source.Values.Max(x => x?.Count ?? 0);
   for (var i = 0; i < max; i++)
      yield return string.Concat(source.Values.Select(x => x.ElementAtOrDefault(i)));
}

用法

var results = DoStuff(keyvalues);
Console.WriteLine(string.Join(Environment.NewLine,results));

输出

1A20
2B30
3C40
4D50

public static IEnumerable<string> DoStuff<T>(List<T>[] source)
{
   var max = source.Max(x => x?.Count ?? 0);
   for (var i = 0; i < max; i++)
      yield return string.Concat(source.Select(x => x.ElementAtOrDefault(i)));
}

...

var results = DoStuff(keyvalues.Values.ToArray());
Console.WriteLine(string.Join(Environment.NewLine,results));

【讨论】:

  • 显示相同的值
  • @jishansiddique 再试一次,我错了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2022-01-01
  • 2021-07-08
  • 2010-11-05
相关资源
最近更新 更多