我知道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) 我的问题涉及一系列通用方法中的类型检查.假设我有一个扩展方法,它尝试将字节数组转换为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) 我目前正在开发一个 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#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中存储的日期时间?获取我的身份证的最佳方法是什么?
缺乏关于这个问题的问题可能是这里代码味道的一个迹象,但是......是否有可能为类和数据绑定写一个扩展方法,就像你想要一个属性一样?
假设我提供了一个我无法从根本上改变的类结构,但我想将一系列布尔属性表示为字符串以用于显示目的.
简化的基类:
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# ×5
.net-4.8 ×1
asp.net-mvc ×1
cultureinfo ×1
data-binding ×1
datetime ×1
equality ×1
facade ×1
generics ×1
linq ×1
multilingual ×1
mvvm ×1
wpf ×1