有没有一种简单的方法可以在制作一个不同的列的数组时展平一组对象?

Is there an easy way to flatten an array of objects while making an array of the one column that would be different?

我有一组与此类似的对象:

 class StateVisitor
 {
     string FirstName { get; set; }
     string LastName { get; set; }
     string StateViseted { get; set; }
 }
    
 StateVisitor[] StateVisitors = {
     new() { FirstName = "Bob", LastName = "Smith", StateViseted = "AL" },
     new() { FirstName = "Bob", LastName = "Smith", StateViseted = "AK" },
     new() { FirstName = "Bob", LastName = "Jones", StateViseted = "AL" },
     new() { FirstName = "Sam", LastName = "Smith", StateViseted = "UT" }
  }

我想做这样的事情:

 class VisitorsWithCombinedStates {
    string FirstName { get; set; }
    string LastName { get; set; }
    string[] StatesVisetedArray { get; set; }
}

 VisitorsWithCombinedStates[] visitorsWithCombinedStates = StateVisitors... /* Linq magic? */

 visitorsWithCombinedStates.ForEach(v 
     => Console.WriteLine($"{v.FirstName} {v.LastName} visited {string.Join(", ",v.StatesVisitedArray)}"));

        // "Bob Smith visited AL, AK"
        // "Bob Jones visited AL"
        // "Sam Smith visited UT"

在 C# 中(可能使用 LINQ)是否有一种简单的方法可以将第一个数组展平为第二个数组,并在其中生成一个已访问状态的数组?

您想按名字和姓氏的组合对项目进行分组,并将分组结果投影为访问过的州

var groups = stateVisitors.GroupBy(sv => new
    {
        sv.FirstName,
        sv.LastName,
    },
    sv => sv.StateVisited );

输出:

foreach(var g in groups)
{
    // g.Key.FirstName
    // g.Key.LastName
    // g is IEnumerable<string> of visited states
}

一个例子,填写你的 VisitorsWithCombinedStates class:

VisitorsWithCombinedStates[] visitorsWithCombinedStates = StateVisitors.GroupBy(x => new { x.FirstName, x.LastName},x => x.StateViseted)
.Select(x => new VisitorsWithCombinedStates { FirstName = x.Key.FirstName, LastName = x.Key.LastName, StatesVisetedArray = x.ToArray() }).ToArray();

我认为您正在寻找 GroupBy 然后将这些组投影到您的新 class:

var visitorsWithCombinedStates = StateVisitors.GroupBy(sv => new { sv.FirstName, sv.LastName }, sv => sv.StateVisited)
                                              .Select(svg => new VisitorsWithCombinedStates {
                                                  FirstName = svg.Key.FirstName,
                                                  LastName = svg.Key.LastName,
                                                  StatesVisitedArray = svg.ToArray()
                                              })
                                              .ToArray();

注意:更正了 visited 的拼写