gpt4 book ai didi

c# - 用 Linq 查询替换 for-switch 循环

转载 作者:太空狗 更新时间:2023-10-29 22:54:15 24 4
gpt4 key购买 nike

我有一个 Message 对象,它包装了我无法控制的消息格式。该格式是键/值对的简单列表。我想从给定的消息中提取用户列表。例如给定以下消息...

1. 200->....
2. 300->....
3. ....
4. 405->....
5. 001->first_user_name
6. 002->first_user_phone
7. 003->first_user_fax
8. 001->second_user_name
9. 001->third_user_name
10. 002->third_user_phone
11. 003->third_user_fax
12. 004->third_user_address
13. .....
14. 001->last_user_name
15. 003->last_user_fax

我想提取四个具有提供的属性集的用户。初始键 200/300....405 代表我不需要的字段,可以跳过以获取用户数据。

每个用户的数据都在连续的字段中,但字段的数量取决于对用户的了解程度。以下方法可以满足我的需求。它使用可能的键类型的枚举和一种方法来查找具有用户数据的第一个字段的索引。

private List<User> ParseUsers( Message message )
{
List<User> users = new List<User>( );
User user = null; String val = String.Empty;

for( Int32 i = message.IndexOfFirst( Keys.Name ); i < message.Count; i++ )
{
val = message[ i ].Val;

switch( message[ i ].Key )
{
case Keys.Name:
user = new User( val );
users.Add( user );
break;
case Keys.Phone:
user.Phone = val;
break;
case Keys.Fax:
user.Fax = val;
break;
case Keys.Address:
user.Address = val;
break;
default:
break;
}
}

return users;
}

我想知道是否可以用 Linq 查询替换该方法。我无法告诉 Linq 选择一个新用户并用所有匹配数据填充其字段,直到找到下一个用户条目的开头。

注意:在真实的消息格式中,相对 key 编号是随机的(不是 1,2,3,4)。

最佳答案

我看不出将您的代码更改为 LINQ 查询有什么好处,但这绝对是可能的:

private List<User> ParseUsers(Message message)
{
return Enumerable
.Range(0, message.Count)
.Select(i => message[i])
.SkipWhile(x => x.Key != Keys.Name)
.GroupAdjacent((g, x) => x.Key != Keys.Name)
.Select(g => g.ToDictionary(x => x.Key, x => x.Val))
.Select(d => new User(d[Keys.Name])
{
Phone = d.ContainsKey(Keys.Phone) ? d[Keys.Phone] : null,
Fax = d.ContainsKey(Keys.Fax) ? d[Keys.Fax] : null,
Address = d.ContainsKey(Keys.Address) ? d[Keys.Address] : null,
})
.ToList();
}

使用

static IEnumerable<IEnumerable<T>> GroupAdjacent<T>(
this IEnumerable<T> source, Func<IEnumerable<T>, T, bool> adjacent)
{
var g = new List<T>();
foreach (var x in source)
{
if (g.Count != 0 && !adjacent(g, x))
{
yield return g;
g = new List<T>();
}
g.Add(x);
}
yield return g;
}

关于c# - 用 Linq 查询替换 for-switch 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7607629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com