如何解决Linq查询,其中将DataTable中的第一列与第二列进行比较以进行重复
我已经合并了包含两列重复项的DataTable。
DataTable结构:“工作号码用户名”
1234 John
1235 Mike
1235 Mike
1236 Donald
1236 Jack
我要赶上
1236 Donald
1236 Jack
,最好以格式
输出1236 Donald Jack
一段时间以来,我一直在尝试为此目的创建Linq查询(相当长的时间),但是我找不到正确的方法。
这是我到目前为止所拥有的。这行得通,我只是用daTarow.Field<string>("WORKNUMBER")
测试了列名是否正确:
public static DataTable ProjectsInLiinos = new DataTable();
...
MainProcess.MergedTable();
foreach (DaTarow daTarow in MainProcess.ProjectsInLiinos.Rows)
{
Console.WriteLine(daTarow.Field<string>("WORKNUMBER") + daTarow.Field<string>("USERNAME"));
}
这是Linq查询:
var queryCustomers = from data in MainProcess.ProjectsInLiinos.AsEnumerable()
where data.Field<string>("WORKNUMBER").Count() > 1 && data.Field<string>("USERNAME").Count() < 1
select data;
它不产生任何东西。我不知道如何在第一列重复项与第二列重复项进行比较的情况下声明?
否则我可以将daTarow.Field<string>("WORKNUMBER") + daTarow.Field<string>("USERNAME")
分组,然后检查列表中是否有重复项,但是它将产生:
1235Mike
1235Mike
反之亦然
1234John
1236Donald
1236Jack
解决方法
尝试以下操作:
DataTable dt = new DataTable();
dt.Columns.Add("Worknumber",typeof(int));
dt.Columns.Add("Username",typeof(string));
dt.Rows.Add(new object[] {1234,"John"});
dt.Rows.Add(new object[] {1235,"Mike"});
dt.Rows.Add(new object[] {1235,"Mike"});
dt.Rows.Add(new object[] {1236,"Donald"});
dt.Rows.Add(new object[] {1236,"Jack"});
var distinct = dt.AsEnumerable()
.GroupBy(x => x.Field<int>("Worknumber"))
.Select(x => new { workNumber = x.Key,user = x.Select(y => y.Field<string>("Username")).Distinct().ToList() })
.Where(x => x.user.Count > 1)
.Select(x => new { workNumber = x.workNumber,user = string.Join(" ",x.user) })
.ToList();
,
查看此简单演示
public class C
{
public int Worknumber { get; set; }
public string Username { get; set; }
public C(int worknumber,string username)
{
Worknumber = worknumber;
Username = username;
}
}
void Main()
{
var lst = new List<C>(){
new C(1234,"Mike"),new C(1235,new C(1236,"Donald"),"Jake")
};
var p = lst.GroupBy(t => t.Worknumber)
.Select(t => new { Key = t.Key,l = t.Select(x => x.Username).ToList() })
.Where(x => x.l.Distinct().Count() > 1)
.Select(x => String.Format("{0} {1}",x.Key,string.Join(' ',x.l)))
.Dump();
}
,
您可以使用分组依据:
void Main()
{
DataTable tbl = new DataTable();
tbl.Columns.Add("Id",typeof(int));
tbl.Columns.Add("Name",typeof(string));
tbl.Rows.Add(1234,"John");
tbl.Rows.Add(1235,"Mike");
tbl.Rows.Add(1235,"Mike");
tbl.Rows.Add(1236,"Donald");
tbl.Rows.Add(1236,"Jack");
var dupes = tbl.AsEnumerable()
.GroupBy(t => t.Field<int>("Id"))
.Where(x => x.Select(y => y.Field<string>("Name")).Distinct().Count() > 1)
.Select(x => new
{
Id = x.Key,Names = string.Join(",",x.Select(y => y.Field<string>("Name")))
});
foreach (var dupe in dupes)
{
Console.WriteLine($"{dupe.Id}:{dupe.Names}");
}
}
我认为还是使用源而不是使用两者之间的DataTable会更好。
, 如已经建议的,请按照第一列的顺序进行分组。然后,您可以通过Where过滤器中的第二个分组找到不同的用户名:
npm http GET http://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz
npm http 200 http://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz
> utf-8-validate@5.0.2 install /usr/lib/node_modules/aws-azure-
login/node_modules/puppeteer/node_modules/utf-8-validate
> node-gyp-build
> bufferutil@4.0.1 install /usr/lib/node_modules/aws-azure-
login/node_modules/puppeteer/node_modules/bufferutil
> node-gyp-build
make: Entering directory `/usr/lib/node_modules/aws-azure-
login/node_modules/puppeteer/node_modules/utf-8-validate/build'
make: Entering directory `/usr/lib/node_modules/aws-azure-
login/node_modules/puppeteer/node_modules/bufferutil/build'
CC(target) Release/obj.target/validation/src/validation.o
CC(target) Release/obj.target/bufferutil/src/bufferutil.o
../src/bufferutil.c:3:22: fatal error: node_api.h: No such file or directory
#include <node_api.h>
^
compilation terminated.
../src/validation.c:3:22: fatal error: node_api.h: No such file or directory
#include <node_api.h>
^
compilation terminated.
make: *** [Release/obj.target/bufferutil/src/bufferutil.o] Error 1
make: Leaving directory `/usr/lib/node_modules/aws-azure-
login/node_modules/puppeteer/node_modules/bufferutil/build'
gyp ERR! build error
我在这里使用了匿名类型,但是您可以轻松地编写一个具有适当构造函数的自定义类,以适合用户名值。
,假设您有
class MyClass : IEquatable<MyClass> // IEquatable is required to perform Dictinct()
{
public string Worknumber { get; set; }
public string Username { get; set; }
public bool Equals(MyClass other)
{
if (this.Username != other.Username)
return false;
if (this.Worknumber != other.Worknumber)
return false;
return true;
}
public override int GetHashCode() // required for objects comparison
{
int hashWorknumber = Worknumber == null ? 0 : Worknumber.GetHashCode();
int hashUsername = Username == null ? 0 : Username.GetHashCode();
return hashWorknumber ^ hashUsername;
}
}
和这样的模拟
List<MyClass> myclasses = new List<MyClass>();
myclasses.Add(new MyClass { Worknumber = "1234",Username = "John" });
myclasses.Add(new MyClass { Worknumber = "1235",Username = "Mike" });
myclasses.Add(new MyClass { Worknumber = "1235",Username = "Mike" });
myclasses.Add(new MyClass { Worknumber = "1236",Username = "Donald" });
myclasses.Add(new MyClass { Worknumber = "1236",Username = "Jack" });
我们进行一个简单的lambda查询
var result = myclasses
.Distinct()
.GroupBy(e => e.Worknumber) // grouping
.Select(e => new
{
Worknumber = e.Key,Count = e.Count(),Users = string.Join(" ",e.Select(p => p.Username)) // joining names
})
.Where(e => e.Count > 1) // filtering duplicates only
.ToList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。