Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无礼 代码e将更容易更改:例如,如果DataTable被数据库替换,则更改会更少 易于测试:您可以使用列表作为输入来测试LINQ语句;无需为测试创建数据集 更好的可重用性:您可以重用数据表来提取数据用于其他目的。您可以将LINQ语句重新用于其他输入源_C#_Linq_Lambda - Fatal编程技术网

C# 无礼 代码e将更容易更改:例如,如果DataTable被数据库替换,则更改会更少 易于测试:您可以使用列表作为输入来测试LINQ语句;无需为测试创建数据集 更好的可重用性:您可以重用数据表来提取数据用于其他目的。您可以将LINQ语句重新用于其他输入源

C# 无礼 代码e将更容易更改:例如,如果DataTable被数据库替换,则更改会更少 易于测试:您可以使用列表作为输入来测试LINQ语句;无需为测试创建数据集 更好的可重用性:您可以重用数据表来提取数据用于其他目的。您可以将LINQ语句重新用于其他输入源,c#,linq,lambda,C#,Linq,Lambda,所以,让我们分开我们的关注点 回到你的问题上来 首先,您需要一个类来表示保存在数据表中的数据。显然,这是保存在DataTable的每一行中的IEnumerable数据序列。大概是这样的: class MyData { public string OptionId {get; set;} public string CatId {get; set;} ... } 您还可以创建一个类,该类表示包含MyData的一个对象的数据行,以及一个类,该类表示包含MyDataRows序

所以,让我们分开我们的关注点

回到你的问题上来 首先,您需要一个类来表示保存在
数据表中的数据。显然,这是保存在
DataTable
的每一行中的
IEnumerable
数据序列。大概是这样的:

class MyData
{
    public string OptionId {get; set;}
    public string CatId {get; set;}
    ...
}
您还可以创建一个类,该类表示包含MyData的一个对象的数据行
,以及一个类,该类表示包含MyDataRows序列的数据表

我个人认为这些类不会添加很多功能,因此我将为
DataRow
DataTable
编写一些类似LINQ的扩展函数,将表转换为
MyData
的可枚举序列。看

每个myItem都是MyData的对象

如果您计划更频繁地使用
匹配数据的概念,或者希望记住,将来您可能希望更改匹配的数据,例如以“M11F”开头的数据,那么如果您希望使此需求更好地可更改、可重用、可测试(无论如何,您现在已经知道了演练),使其成为
MyData
的扩展函数:

public static IEnumerable<MyData> WhereMatches(this IEnumerable<MyData> source)
{
    // TODO: check for null source
    return source.Where(item => item.OptionId.Length == 8
    && item.OptionId.StartsWith("M00F"));
}
一些旁白:

    <> LI>如果您想确定不能将不正确的数据集放入ToMyDataS,请考虑创建DataTaband DataRoW派生的MyDataTrand和MyDataRoW。此类隐藏数据表的组织方式。此外,它确保您不会将格式不正确的数据表放入函数中。但是,在这种情况下,代码太小,似乎很难添加任何有用的功能
  • 考虑创建函数进行转换:将MyData序列转换为DataTable,或将DataRows序列转换为DataRows,可用于将行添加到现有DataTable

您需要使用长度函数来检查列中数据的长度。阅读
\u dtOptions。选择(“LEN(OptionID)=8,OptionID类似于'M00F%'”将正则表达式与linq:_dtOptions.AsEnumerable().Where(x=>Regex.Match(x,“M00F\d{4}”).IsMatch.ToList()一起使用;您需要使用LENGTH函数来检查列中数据的长度。阅读
\u dtOptions。选择(“LEN(OptionID)=8,OptionID类似于'M00F%'”将正则表达式与linq:_dtOptions.AsEnumerable().Where(x=>Regex.Match(x,“M00F\d{4}”).IsMatch.ToList()一起使用;绝对完美,谢谢你保持简单。谢谢贺芒。绝对完美,谢谢你保持简单。谢谢赫芒。谢谢你深思熟虑和合理的回答。最后,我选择了简单明了的方法。谢谢你的深思熟虑和合理的回答。最后我选择了简捷的方法。
class MyData
{
    public string OptionId {get; set;}
    public string CatId {get; set;}
    ...
}
// Convert a DataRow to a MyData:
public static MyData ToMyData(this DataRow row)
{
    // Todo: check for null row
    return new MyData
    {
        OptionId = row... // TODO implement
        ...
    }
}

// Convert a sequence of DataRows to a sequence of MyData
public static IEnumerable<MyData> ToMyData(this IEnumerable<DataRow> rows)
{
    // TODO: check for null rows
    return rows.Select(row => row.ToMyData());
}

// Convert a DataTable to a sequence of MyData:
public static IEnumerable<MyData> ToMyData(this DataTable table)
{
     // TODO: check for null table
     return table.Rows.Cast<DataRow>().ToMyData();
}
DataTable table = ...
IEnumerable<MyData> myItems = table.ToMyData();
var matchingData = myItems.Where(myItem => myItem.OptionId.Length == 8
                                        && myItem.OptionId.StartsWith("M00F"));
public static IEnumerable<MyData> WhereMatches(this IEnumerable<MyData> source)
{
    // TODO: check for null source
    return source.Where(item => item.OptionId.Length == 8
    && item.OptionId.StartsWith("M00F"));
}
DataTable table = ...
var matchinData = table.ToMyData().WhereMatches();