Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.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# Linq检索在集合和非集合之间更改的项_C#_Linq_Linq To Objects - Fatal编程技术网

C# Linq检索在集合和非集合之间更改的项

C# Linq检索在集合和非集合之间更改的项,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,以下是我的课程: public class XDetail { public string Name { get; set; } public int ID { get; set; } } public class X { public int XID { get; set; } public int ID { get; set; } } ID在它们之间共享以链接X和XDetail(一对多关系),X和XDetail实际上是类型化数据行。我使用以下linq查询读

以下是我的课程:

public class XDetail
{
    public string Name { get; set; }
    public int ID { get; set; }
}

public class X
{
    public int XID { get; set; }
    public int ID { get; set; }
}
ID在它们之间共享以链接X和XDetail(一对多关系),X和XDetail实际上是类型化数据行。我使用以下linq查询读入一个文件,并形成一个匿名类型:

var results = (from line in File.ReadAllLines(file)
              select new
              {
                  XID = int.Parse(line.Substring(0, 8).TrimStart('0')),
                  Name = line.Substring(8, 255).Trim()
              }).ToList();
此数据用于对照现有的X/X详细信息进行检查,以进行适当的更改或添加新记录。我将结果包装在一个检查中,以查看当序列没有结果时它是否抛出.ToList()。XList是一个列表,XDetailList是一个列表

从这里,我尝试使用一个奇特的linq查询来匹配适当的项:

var changedData = from x in XList
                  join xDetail in XDetailList on x.ID equals xDetail.ID
                  where 
                  (!results.Any(p => p.XID.Equals(x.XID))
                  || !results.Any(p => p.Name.Equals(xDetail.Name)))                   
                  select new
                  {                       
                      XValue = x,
                      XDetailValue = xDetail,
                      Result = (from result in results
                               where result.Name.Equals(xDetail.Name)
                               select result).SingleOrDefault()
                  };
我的新问题是,这个查询只提供X/XDetail中更改的内容,而不提供新的内容。为了获得新的内容,我必须运行另一个查询,在测试小数据集(3个现有的X/XDetail条目)时,该查询似乎足够好,但当我尝试真正的文件并翻阅它的~7700个条目时,我似乎有无尽的处理

对于X/XDetail中已包含的以下示例数据集:
XID:1,姓名:Bob,ID:10
西德:2,姓名:乔,身份证号码:20
西德:3,姓名:山姆,身份证号码:30

结果文件包含:
XID:2,名称:Bob2
XID:3,名称:NotSam
XID:4,姓名:NewGuy
XID:5,姓名:NewGuy2

我希望能够获得包含以下内容的结果集:
{XID:2,Name:Bob2},x,xDetail
{XID:3,Name:NotSam},x,xDetail
{XID:4,Name:NewGuy},x,xDetail
{XID:5,名称:NewGuy2},x,xDetail

我希望将x和xDetail作为结果集的一部分,以便使用这些类型化的数据行进行必要的更改

我试图提出这样一个问题:

var newData = from result in results
              join x in XList on result.XID equals x.XID
              join xDetail in XDetailList on x.ID equals xDetail.ID
                      where
                      (x.XID == result.XID && xDetail.Name != result.Name)
                      select new
                      {
                          XValue = x,
                          XDetailValue = xDetail,
                          Result = result
                      };
由于连接表明我只会在数据中获取更改的项,我真的希望能够添加X/XDetail中没有的数据,并停止在过去2.5小时内一直在处理我的~7700更改文件的系统。我觉得我已经盯着这个问题和相关的查询太久了,以至于无法发现我应该做些什么来正确地为它构建where子句


是否有一种方法可以构造linq查询,以查找已更改的数据和X/XDetail中不存在的数据,并将其返回到新的结果集中进行处理?

我认为您的性能问题与查询的复杂性有关,可能与
O(n^2)
有关

因此,首先我建议您在查找结构中设置当前数据,如下(*):

现在,我不确定,但我假设说“更改的数据”是指已经存在XID但有新名称的条目列表,对吗?
如果是,您可以使用以下查询获取“更改的数据”:

var changedData = results
.Where(r => joinedByXID.Contains(r.XID))
.SelectMany(r => joinedByXID[r.XID]
            .Where(x => x.XDetail.Name != r.Name)
            .Select(old => new {XValue=old.X, XDetailValue=old.XDetail, Result=r}));
然后,如果“新数据”指的是具有新XID的条目列表(XID当前不存在于XList/XDetailList中),那么您不能将它们与X/Xdetail元素匹配,因为没有任何元素,所以这很简单:

var newData = results
.Where(r => !joinedByXID.Contains(r.XID));
(*)

实际上,为了更快,您可以将数据安排在dictionary of dictionary中,其中外键是XID,内键是名称。

是否有方法构造linq查询以查找更改的数据和X/XDetail中不存在的数据,并将其返回到要处理的新结果集中?
var newData = results
.Where(r => !joinedByXID.Contains(r.XID));