求有个简便的处理字符串的LINQ方法

烟灰洒落键盘 2012-07-05 10:04:04
有一个下面的list<string>,通过一个算法使最终输出"*MLCQ-13463-120627-001*",

规则:选择次数出现最多的并且不能是"?"的,有没有不适用遍历的,最好LINQ能解决

"*???"
"*MLC?-??"
"*MLCQ-??"
"*MLCQ?1346?+"
"*MLCQ?13463-?????"
"*MLCQ-13463-1206?"
"*MLCQ-13463-120627-??/"
"*MLCQ-13463-120627-001?"
"*?LCQ-?3463-120627-0?1*"
"*MLCQ-?3463-1?0627-001*"
"*MLCQ-?3463-1?0627-001*"
"*MLCQ-?3463-1?0627-001*"
"*MLCQ-?3463-1?0?27-00??"
"*MLCQ-?3463-1?0627-001?"
"*MLCQ-?3463-1?0627-001?"
"*MLCQ-?3463-1?06?7-00??"
"*MLCQ-?3463-1?06?7-001?"
"*ML?Q-??46?-1?06?7-001?"
"*MLCQ-13463-1?0627-00??"
"*MLCQ-13463-1?0627-00??"
"*MLCQ-?346?-1?06??-00??"
"*ML?Q-??46?-??06?7-001?"
"*ML?Q-1346?-1?06?7-001?"
"*ML?Q-1346?-1?06?7-00??"
"*ML?Q-??463-1?06??-00??"
"*ML?Q-1?463-1?06?7-001?"
"*ML?Q-1?463-1?06?7-001?"
"*?Z??"
"*ML?Q-1?463-1?06?7-001?"
"*M??Q-??46?-1?06??-00??"
"*ML?Q-13463-1?06??-0???"
"*ML?Q-13463-1?06??-0???"
"*M??Q-?3463-1?06??-00?*"
"*ML?Q-13463-1?06??-001*"
"*M??Q-13463-1?06??-001*"
"*M??Q-13463-1?06??-001*"
"*M????13463-1?06??-0?1*"
"*M??Q?13463-1206??-0?1?"
"*M?CQ?13463-1206??-001*"
"*MLCQ?13463-1206??-001*"
"*MLC??13463-1206??-001*"
"*M?CQ?13463-12062?-001*"
"*MLCQ?13463-12062?-001*"
"*MLCQ?13463-12062?-001*"
"*MLCQ-13463-1206??-001*"
"*MLCQ-13463-12062?-001*"
...全文
228 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
createTim 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

public static class SearchString
{
public static List<string> Search(this List<string> self,string str)
{
List<string> templist = new List<string>();
……
[/Quote]

可能有点小地方要修改 你改一下应该是可以的
createTim 2012-07-05
  • 打赏
  • 举报
回复
public static class SearchString
{
public static List<string> Search(this List<string> self,string str)
{
List<string> templist = new List<string>();
string temp = string.Empty;
int star = 0;
int end = 0;
foreach (char s in str)
{
if(s.Equals('?'))
{
templist = self.Where(p => p.Substring(star, end) == temp).ToList();

temp = string.Empty;
star = end;
continue;
}
temp += s;
end++;
}

return null;
}
}
  • 打赏
  • 举报
回复
List<string> list = new List<string>() { 
"*???",
"*MLC?-??",
"*MLCQ-??",
"*MLCQ?1346?+",
"*MLCQ?13463-?????",
"*MLCQ-13463-1206?",
"*MLCQ-13463-120627-??/",
"*MLCQ-13463-120627-001?",
"*?LCQ-?3463-120627-0?1*",
"*MLCQ-?3463-1?0627-001*",
"*MLCQ-?3463-1?0627-001*",
"*MLCQ-?3463-1?0627-001*",
"*MLCQ-?3463-1?0?27-00??",
"*MLCQ-?3463-1?0627-001?",
"*MLCQ-?3463-1?0627-001?",
"*MLCQ-?3463-1?06?7-00??",
"*MLCQ-?3463-1?06?7-001?",
"*ML?Q-??46?-1?06?7-001?",
"*MLCQ-13463-1?0627-00??",
"*MLCQ-13463-1?0627-00??",
"*MLCQ-?346?-1?06??-00??",
"*ML?Q-??46?-??06?7-001?",
"*ML?Q-1346?-1?06?7-001?",
"*ML?Q-1346?-1?06?7-00??",
"*ML?Q-??463-1?06??-00??",
"*ML?Q-1?463-1?06?7-001?",
"*ML?Q-1?463-1?06?7-001?",
"*?Z??",
"*ML?Q-1?463-1?06?7-001?",
"*M??Q-??46?-1?06??-00??",
"*ML?Q-13463-1?06??-0???",
"*ML?Q-13463-1?06??-0???",
"*M??Q-?3463-1?06??-00?*",
"*ML?Q-13463-1?06??-001*",
"*M??Q-13463-1?06??-001*",
"*M??Q-13463-1?06??-001*",
"*M????13463-1?06??-0?1*",
"*M??Q?13463-1206??-0?1?",
"*M?CQ?13463-1206??-001*",
"*MLCQ?13463-1206??-001*",
"*MLC??13463-1206??-001*",
"*M?CQ?13463-12062?-001*",
"*MLCQ?13463-12062?-001*",
"*MLCQ?13463-12062?-001*",
"*MLCQ-13463-1206??-001*",
"*MLCQ-13463-12062?-001*"

};
StringBuilder sb = new StringBuilder();
int column_count = list.Max(a => a.Length);
string[] temp_arr = new string[column_count];
for (int j = 0; j < list.Count(); j++)
{
for (int k = 0; k < list[j].Length; k++)
{
temp_arr[k] += list[j][k];
}
}
foreach (string item in temp_arr)
{
var temp=item.ToCharArray().Where(a=>a!='?').GroupBy(a => a).OrderByDescending(a=>a.Count()).FirstOrDefault();
if (temp != null)
{
sb.Append(temp.Key.ToString());
}
else
{
sb.Append("?");
}
}
string result = sb.ToString();
//*MLCQ-13463-120627-001*
烟灰洒落键盘 2012-07-05
  • 打赏
  • 举报
回复
对的,就是这样,这个是读条码的数据,读的是条码图片上的每一行,有的行由于图片质量问题,有些字符读不出来,就用?代替了,下一行有可能就把这个字符读出来的,所以这样那些扫描不清晰的图片也能都出正确的结果,相当于一种容错方案吧
qldsrx 2012-07-05
  • 打赏
  • 举报
回复
哈哈,其实你不是想要得到一个固定的值——"*MLCQ-13463-120627-001*",而是要得到出现最多次数的字符组合,你的第一行话误导了一片。
不过你要不通过循环是不可能的,即使用Linq,还是有循环在里面,而且Linq的循环次数比你手控循环次数更多,因此Linq慢。
烟灰洒落键盘 2012-07-05
  • 打赏
  • 举报
回复
简单的例子,要是只含2条记录
"*MLCQ-13463-120627-001?"
"*?LCQ-?3463-120627-0?1*"
输出的结果是:
*MLCQ-13463-120627-001*
q107770540 2012-07-05
  • 打赏
  • 举报
回复
还是不知道你在说些什么
烟灰洒落键盘 2012-07-05
  • 打赏
  • 举报
回复
可能没有描述清楚,比如说第一个字符有出现了2中不同的字符"M"和"?",实际中还可能有"N",那么就比对这3个字符出现的次数,,当全部是"?"的时候第一个字符就是"?",否则选择出现次数最多且不为"?"作为第一个字符,后面的字符一次类推
  • 打赏
  • 举报
回复
好像看错了.
q107770540 2012-07-05
  • 打赏
  • 举报
回复
*MLCQ-13463-120627-001* 也就出现了一次吧。。。
moonwrite 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C# code
string result=list.GroupBy(a => a).OrderByDescending(a => a.Count()).FirstOrDefault().Key.Replace("?",string.Empty);
//*MLCQ-3463-10627-001*
[/Quote]

最后为什么要replace呢?

还有先包含有?的排除掉 再分组排序 应该会快点把~
bdmh 2012-07-05
  • 打赏
  • 举报
回复

System.IO.StreamReader reader = new System.IO.StreamReader("e:\\1.txt");
//下面对数据进行处理,分离出4个list
List<string>[] list = new List<string>[4];
list[0] = new List<string>();
list[1] = new List<string>();
list[2] = new List<string>();
list[3] = new List<string>();
while (!reader.EndOfStream)
{
string[] s = reader.ReadLine().Split('-');
for (int i = 0; i < s.Length; i++)
{
list[i].Add(s[i]);
}
}
var vs = list[0].GroupBy(x => x).Select(g => new { g.Key, count = g.Count() }).Where(w => w.Key.Contains("?") == false).Max(c => c.Key) + "-" +
list[1].GroupBy(x => x).Select(g => new { g.Key, count = g.Count() }).Where(w => w.Key.Contains("?") == false).Max(c => c.Key) + "-" +
list[2].GroupBy(x => x).Select(g => new { g.Key, count = g.Count() }).Where(w => w.Key.Contains("?") == false).Max(c => c.Key) + "-" +
list[3].GroupBy(x => x).Select(g => new { g.Key, count = g.Count() }).Where(w => w.Key.Contains("?") == false).Max(c => c.Key);
MessageBox.Show(vs.ToString());


结果
*MLCQ-13463-120627-001*
  • 打赏
  • 举报
回复
string result=list.GroupBy(a => a).OrderByDescending(a => a.Count()).FirstOrDefault().Key.Replace("?",string.Empty);
//*MLCQ-3463-10627-001*

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧