小编Mad*_*bot的帖子

使用LINQ将字符串拆分为N长度字符串列表

我知道String.Split的概念之前已经通过多种不同的方法得到了解决,但我对这个问题的LINQ解决方案特别感兴趣.

我试图编写一个扩展类来处理拆分,但两次尝试都有一些重大问题.所以对于以下内容:

string s = "ABCDEFGHIJKLMNOPQRSTUVWX";
var results = s.SplitEvery(4);
Run Code Online (Sandbox Code Playgroud)

我想要一个列表,如:{"ABCD","EFGH","IJKL","MNOP","QRST","UVWX"}

这是我的扩展类:

public static class Extensions
{
    public static List<string> SplitEvery(this string s, int n)
    {
        List<string> list = new List<string>();

        var Attempt1 = s.Select((c, i) => i % n== 0 ? s.Substring(i, n) : "|").Where(x => x != "|").ToList();

        var Attempt2 = s.Where((c, i) => i % n== 0).Select((c, i) => s.Substring(i, n)).ToList();

        return list;
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试1插入一个虚拟字符串"|" 每次不满足条件时,都会删除虚拟字符串的所有实例以创建最终列表.它有效,但创建坏字符串似乎是一个不必要的额外步骤.此外,如果字符串不能被n整除,则此尝试将失败.

尝试2是我试图仅选择索引可被N整除的子串,但Select语句中的'i'值与Where语句中的'i'值不对应,因此我得到如下结果:{" ABCD","BCDE"等...}

我觉得我接近一个好的解决方案,但可以在正确的方向上使用有用的推动.有什么建议?

[编辑]

我最后提出了一些处理我的字符串拆分器的建议.它可能不是最快的,但作为LINQ的新手,这个实现对我来说是最简洁易懂的.

public static List<string> SplitEvery(this string …
Run Code Online (Sandbox Code Playgroud)

c# linq

20
推荐指数
4
解决办法
1万
查看次数

避免在泛型方法中进行过多的类型检查?

我的问题涉及一系列通用方法中的类型检查.假设我有一个扩展方法,它尝试将字节数组转换为int,decimal,string或DateTime.

public static T Read<T>(this ByteContainer ba, int size, string format) where T : struct, IConvertible
{
    var s = string.Concat(ba.Bytes.Select(b => b.ToString(format)).ToArray());            
    var magic = FromString<T>(s);
    return (T)Convert.ChangeType(magic, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)

这会调用一个名为FromString的方法,该方法将连接的字符串转换为特定的类型.不幸的是,业务逻辑完全依赖于类型T.所以我最终得到了一个巨石if-else块:

private static T FromString<T>(string s) where T : struct
{
    if (typeof(T).Equals(typeof(decimal)))
    {
        var x = (decimal)System.Convert.ToInt32(s) / 100;
        return (T)Convert.ChangeType(x, typeof(T));
    }
    if (typeof(T).Equals(typeof(int)))
    {
        var x = System.Convert.ToInt32(s);
        return (T)Convert.ChangeType(x, typeof(T));
    }
    if (typeof(T).Equals(typeof(DateTime)))
        ... etc ...
 }
Run Code Online (Sandbox Code Playgroud)

在这一点上,我更喜欢具有相同名称和不同返回类型的多个方法,类似于以下内容:

// <WishfulThinking>
private static decimal FromString<T>(string s) …
Run Code Online (Sandbox Code Playgroud)

c# generics

7
推荐指数
2
解决办法
773
查看次数

.NET 对不支持的 ISO 639-2 文化的多语言支持

我目前正在开发一个 ASP.NET 4.8 MVC 单页应用程序,预计支持多种语言。从各种资源中,我发现实现此目的的一种方法是使用App_GlobalResources每种受支持语言的资源文件。

我在页面中添加了一些导航链接,用于更新线程的当前文化信息,从而将这些语言资源拉入我的应用程序中。

var cultureInfo = CultureInfo.GetCultures(CultureTypes.AllCultures)
                             .FirstOrDefault(x => x.ThreeLetterISOLanguageName == language);

if (cultureInfo == null)
     cultureInfo = CultureInfo.GetCultureInfo("en-US");

Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Run Code Online (Sandbox Code Playgroud)

这对于有文化支持的语言来说似乎效果很好。(IE:“eng”拉回en-us并找到Content.en.resx文件,“spa”检索Content.es.resx等)但是我遇到了困难,语言出现在 ISO639-2 列表中(苗族、凯伦族)但没有关联的 CultureInfo跟他们。

我尝试过使用这些来分离文化CultureAndRegionInfoBuilder,但根据我的理解,这只能在我的计算机上运行,​​而不能在网络上运行。我也无法“破解”现有文化 - 即采用越南语并替换其ThreeLetterISOLanguageName和其他属性 - 因为这些属性是只读的。

当 CultureInfo 不可用时,是否有明确的方法告诉我的代码引用特定的内容文件?还是我以完全错误的方式处理这个问题?

c# asp.net-mvc multilingual cultureinfo .net-4.8

5
推荐指数
0
解决办法
472
查看次数

C#datetime和SQL datetime之间的平等比较失败

我试图在C#datetime和SQL datetime之间进行相等比较,由于存储这些值的精度,它似乎失败了.

所以说我有一个非常简单的SQL表,包含以下字段:

ID (PK, int, not null) - identity
Title (text, null)
UpdateTime (datetime, not null)
Run Code Online (Sandbox Code Playgroud)

我通过Entity框架创建一个类对象,将其UpdateTime设置为DateTime.Now,如下所示:

DateTime now = DateTime.Now;
Title.UpdateTime = now;
Run Code Online (Sandbox Code Playgroud)

当我将新对象插入表格时,我发现所有值都显示正确存储.现在我想要为我的对象创建的ID.

这是事情变得困难的地方.我尝试通过LINQ拉回ID:

Title.ID = context.DBTitles.Where(x=>x.UpdateTime == now).FirstOrDefault().ID;
Run Code Online (Sandbox Code Playgroud)

这会引发异常,因为查询返回null,尽管我插入的'now'应该与插入到我的表中的'now'相同.

所以我的问题是:我如何确保我的C#datetime等同于SQL中存储的日期时间?获取我的身份证的最佳方法是什么?

c# datetime linq-to-entities equality sql-server-2008

3
推荐指数
1
解决办法
859
查看次数

是否可以数据绑定到扩展方法?

缺乏关于这个问题的问题可能是这里代码味道的一个迹象,但是......是否有可能为类和数据绑定写一个扩展方法,就像你想要一个属性一样?

假设我提供了一个我无法从根本上改变的类结构,但我想将一系列布尔属性表示为字符串以用于显示目的.

简化的基类:

public class Transmission
{
    public int ID { get; set; }
    public bool Cancelled { get; set; }
    public bool Stored { get; set; }
    public bool Recorded { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的扩展方法:

public static class Extensions
{
    public static string Status(this Transmission trans)
    {
        StringBuilder sb = new StringBuilder("|");
        if (trans.Cancelled)
            sb.Append("| Cancelled ");
        if (trans.Recorded)
            sb.Append("| Recorded ");
        if (trans.Stored)
            sb.Append("| Stored ");
        sb.Append("||");

        return sb.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

为了进一步增加复杂性,我正在传递这些内容的列表,并且我正在尝试绑定到数据网格(具有严格限制的XAML体验).

<GroupBox Header="Here is an amazing …
Run Code Online (Sandbox Code Playgroud)

c# data-binding wpf facade mvvm

3
推荐指数
1
解决办法
1249
查看次数