You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中C#从列表选取多字段报错:无法转换匿名类型数组

解决匿名类型无法转换为string[]的问题

你遇到的这个错误很典型——问题出在类型不匹配上:你用Select生成了一组包含FirstName和LastName的匿名类型对象,但却想把它们赋值给string[]类型的变量,这俩根本不是一回事儿,编译器当然会拦着你。

下面给你几种可行的解决思路,按需选择:

1. 自定义类/记录存储姓名组合(推荐,类型更清晰)

如果之后还会用到这个姓名组合,最好专门定义一个类型:

// C# 9+ 可以用简洁的record(自动实现Equals和GetHashCode,Distinct能直接生效)
public record UserFullName(string FirstName, string LastName);

// 或者传统class(需要手动重写Equals和GetHashCode才能让Distinct正常工作)
public class UserFullName
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public override bool Equals(object obj)
    {
        return obj is UserFullName name &&
               FirstName == name.FirstName &&
               LastName == name.LastName;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(FirstName, LastName);
    }
}

然后修改查询代码,用这个类型接收结果:

UserFullName[] NamesArray = Users
    .Select(i => new UserFullName(i.FirstName, i.LastName))
    .Distinct()
    .OrderByDescending(i => i.FirstName)
    .ToArray();

2. 把姓名拼接成单个字符串(适合只需要文本形式的场景)

如果你只是需要将两个字段合并成一个字符串,直接在Select里拼接即可,这样返回的就是string类型,刚好匹配string[]:

string[] NamesArray = Users
    .Select(i => $"{i.FirstName} {i.LastName}")
    .Distinct()
    .OrderByDescending(i => i)
    .ToArray();

3. 使用ValueTuple(快速临时方案)

如果不想定义新类型,C# 7及以上支持的ValueTuple可以快速解决问题,不过变量得用var声明(因为元组类型是(string, string)[],不是string[]):

var NamesArray = Users
    .Select(i => (FirstName: i.FirstName, LastName: i.LastName))
    .Distinct()
    .OrderByDescending(i => i.FirstName)
    .ToArray();

之后你可以通过NamesArray[0].FirstName和NamesArray[0].LastName来访问每个元素的两个字段。

再补一句错误本质

你原来的代码里,Select(i => new { i.FirstName, i.LastName })会生成一组匿名类型实例,每个实例都有两个string属性,但它本身不是string——就像你不能把一个装了两个字符串的盒子,直接当成单个字符串塞进字符串数组里一样~

内容的提问来源于stack exchange,提问作者user9198450

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:05:05