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
相关产品推荐
相关产品推荐

