C# 是否将列表集合值添加到要在listview中显示的字符串?

C# 是否将列表集合值添加到要在listview中显示的字符串?,c#,C#,我试图获取列表的值,并将它们写入可以在listview中显示的字符串。在我的例子中,我正在检索一个音乐发布列表,每个发布都有一个艺术家列表 这是我的班级: class DownloadsAvailable { OAuth oAuth = new OAuth(); public Metadata metadata { get; set; } public List<DownloadsAvailableResult> results { get; set; } /

我试图获取列表的值,并将它们写入可以在listview中显示的字符串。在我的例子中,我正在检索一个音乐发布列表,每个发布都有一个艺术家列表

这是我的班级:

class DownloadsAvailable
{
    OAuth oAuth = new OAuth();
    public Metadata metadata { get; set; }
    public List<DownloadsAvailableResult> results { get; set; } // List of Songs
    public IEnumerator<DownloadsAvailableResult> GetEnumerator()
    {
        return this.results.GetEnumerator();
    }
}

public class DownloadsAvailableResult // Song
{
    public int id { get; set; }
    public string name { get; set; }
    public string title { get; set; }
    public List<Artist> artists { get; set; }
    public string artistsList { get; set; } // New property to hold string list of artists
}
public class Artist
{
    public int id { get; set; }
    public string name { get; set; }
    public string slug { get; set; }
    public string type { get; set; }
}
类下载可用
{
OAuth OAuth=新的OAuth();
公共元数据{get;set;}
公共列表结果{get;set;}//歌曲列表
公共IEnumerator GetEnumerator()
{
返回此.results.GetEnumerator();
}
}
公共类下载savailableresult//Song
{
公共int id{get;set;}
公共字符串名称{get;set;}
公共字符串标题{get;set;}
公开列表艺术家{get;set;}
公共字符串艺术家列表{get;set;}//用于保存艺术家字符串列表的新属性
}
公共级艺术家
{
公共int id{get;set;}
公共字符串名称{get;set;}
公共字符串slug{get;set;}
公共字符串类型{get;set;}
}
和代码隐藏

private async void GetDownloads()
    {
        OAuth oAuth = new OAuth();

        string oAuthVerifier = ApplicationData.Current.LocalSettings.Values["oauth_verifier"].ToString();
        string httpMethod = "GET";
        string parameters = "status=" + DownloadStatus.available.ToString();
        string response = await oAuth.GetData(OAuth.availDownloadsUrl, httpMethod, parameters, oAuthVerifier);
        DownloadsAvailable downloads = JsonConvert.DeserializeObject<DownloadsAvailable>(response);

        // Foreach loop here to enumerate over list of artists?

        this.listDownloads.ItemsSource = downloads;
    }
private async void GetDownloads()
{
OAuth OAuth=新的OAuth();
字符串oAuthVerifier=ApplicationData.Current.LocalSettings.Values[“oauth_verifier”].ToString();
字符串httpMethod=“GET”;
string parameters=“status=“+DownloadStatus.available.ToString();
字符串响应=等待oAuth.GetData(oAuth.availDownloadsUrl、httpMethod、参数、oAuthVerifier);
DownloadsAvailable downloads=JsonConvert.DeserializeObject(响应);
//Foreach循环在这里枚举艺术家列表?
this.listDownloads.ItemsSource=下载;
}
我不知道如何枚举艺术家列表,以便将他们合并成一个字符串,绑定到listview中的textblock

谢谢你的帮助

更新 谢谢大家的回答,但我想我没有清楚地解释我的问题。我从web请求中获得的数据返回一个歌曲列表。每首歌可以有多个艺术家。我想做的是为每首歌创作一组艺术家。然后可以将其绑定到listview中的textblock

目前,我通过嵌套两个列表视图来实现这一点,如下所示:

<ListView x:Name="listDownloads" ItemsSource="{Binding DownloadsAvailable}" SelectionChanged="listDownloads_SelectionChanged" HorizontalAlignment="Left" Height="auto" VerticalAlignment="Top" Width="auto">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="2*"/>
                            </Grid.ColumnDefinitions>
                            <Image Source="{Binding images.large.url}" Grid.Column="0" Margin="0,10,0,0" />
                            <StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="20,0,0,0">
                                <TextBlock Text="{Binding title}" Style="{StaticResource ListViewItemContentTextBlockStyle}" />
                                <TextBlock Text="{Binding release.name}" Style="{StaticResource ListViewItemSubheaderTextBlockStyle}"/>
                                <ListBox ItemsSource="{Binding artists}" ScrollViewer.VerticalScrollBarVisibility="Disabled">
                                    <ListBox.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <StackPanel Orientation="Horizontal"/>
                                        </ItemsPanelTemplate>
                                    </ListBox.ItemsPanel>
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding name}" Margin="2"/>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </StackPanel>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

因此,我不想使用嵌套列表框来显示一首歌曲的艺术家,而是希望能够为每首歌曲创建一个艺术家字符串,并将其绑定到文本块


我希望这能把事情弄清楚。谢谢。

字符串.Join接受要加入的字符串数组。因此,从艺术家姓名创建这样一个数组:

public string artistsList {
    get {
        return String.Join(", ", artists.Select(a => a.name).ToArray());        
    }
}
你真的想要一个二传手吗?您可以从以逗号分隔的艺术家列表中执行此操作;然而,艺术家的其他属性将丢失

    set {
        artists = value.Split(',')
            .Select(s => new Artist{ name = s.Trim() })
            .ToList();
    }

String.Join
接受要联接的字符串数组。因此,从艺术家姓名创建这样一个数组:

public string artistsList {
    get {
        return String.Join(", ", artists.Select(a => a.name).ToArray());        
    }
}
你真的想要一个二传手吗?您可以从以逗号分隔的艺术家列表中执行此操作;然而,艺术家的其他属性将丢失

    set {
        artists = value.Split(',')
            .Select(s => new Artist{ name = s.Trim() })
            .ToList();
    }

下面是一个例子——假设我有一个列表,该列表的内容如下

  • valList[0]=“状态不能为空”
  • vlaList[1]=“这是测试”
我的列表变量的声明

var valList = new List<string>
{
   "Status can not be empty",
   "This is a Test"
};
var msgString = string.Join(", " , valList);
var valList=新列表
{
“状态不能为空”,
“这是一个测试”
};
var msgString=string.Join(“,”,valList);
  • msgString将保存以下值-请参见下文

状态代码不能为空,服务请求者合同不能为空

这里是一个示例-假设我有一个列表,该列表的内容如下

  • valList[0]=“状态不能为空”
  • vlaList[1]=“这是测试”
我的列表变量的声明

var valList = new List<string>
{
   "Status can not be empty",
   "This is a Test"
};
var msgString = string.Join(", " , valList);
var valList=新列表
{
“状态不能为空”,
“这是一个测试”
};
var msgString=string.Join(“,”,valList);
  • msgString将保存以下值-请参见下文
状态代码不能为空,服务请求者合同不能为空

根据您的更新,对于每首歌曲,您希望将该歌曲的艺术家列表合并为一个字符串。也就是说,对于存储到属性中的每首歌曲(
DownloadsAvailableResult
),您都需要一个这样的字符串。这使得事情变得更简单,因为每首歌都已经知道自己的
列表

更新

根据您的更新,对于每首歌曲,您希望将该歌曲的艺术家列表合并为一个字符串。也就是说,对于存储到属性中的每首歌曲(
DownloadsAvailableResult
),您都需要一个这样的字符串。这使得事情变得更简单,因为每首歌都已经知道自己的
列表


像这样的东西对你有用吗

string artistNames = string.Join(", ", 
    downloads.results.SelectMany(r => r.artists.Select(a => a.name)));
更新

我之前没有注意到您的
DownloadsAvailableResult
类上有
artistsList
属性。如果它只包含艺术家名字,你可以考虑重命名它。