33,027
社区成员




result = ......Take(1);
就行了。
如此方式,我同时通过代码来表达我的意思,来说明这类简单程序的设计思路,以及人为操作程序流程的地方在哪里。并且也还能通过修改一行代码来DEBUG,这种演示很实用,对每一个真正的编程人员!
如果懒得自己动手看看运行过程,那么其运行结果如下(不保证结果是正确的,欢迎指出程序代码中的bug):
2016/1/5 15:52:13开始查找:
第1个解答 2016/1/5 15:54:53:
挪威人,住1号绿房子,抽混合烟,喝咖啡,养鱼
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
瑞典人,住3号黄房子,抽DUNHILL烟,喝牛奶,养狗
英国人,住4号红房子,抽BLUE_MASTER烟,喝啤酒,养马
丹麦人,住5号白房子,抽PALL_MALL烟,喝茶,养鸟
第2个解答 2016/1/5 16:07:02:
挪威人,住1号绿房子,抽PALL_MALL烟,喝咖啡,养鸟
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养鱼
瑞典人,住3号白房子,抽混合烟,喝牛奶,养狗
丹麦人,住4号黄房子,抽DUNHILL烟,喝茶,养猫
英国人,住5号红房子,抽BLUE_MASTER烟,喝啤酒,养马
第3个解答 2016/1/5 16:07:02:
挪威人,住1号绿房子,抽PALL_MALL烟,喝咖啡,养鸟
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养鱼
英国人,住3号红房子,抽混合烟,喝牛奶,养马
丹麦人,住4号黄房子,抽DUNHILL烟,喝茶,养猫
瑞典人,住5号白房子,抽BLUE_MASTER烟,喝啤酒,养狗
第4个解答 2016/1/5 16:09:19:
挪威人,住1号绿房子,抽PALL_MALL烟,喝咖啡,养鸟
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
瑞典人,住3号白房子,抽混合烟,喝牛奶,养狗
丹麦人,住4号黄房子,抽DUNHILL烟,喝茶,养鱼
英国人,住5号红房子,抽BLUE_MASTER烟,喝啤酒,养马
第5个解答 2016/1/5 16:09:19:
挪威人,住1号绿房子,抽PALL_MALL烟,喝咖啡,养鸟
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
英国人,住3号红房子,抽混合烟,喝牛奶,养马
丹麦人,住4号黄房子,抽DUNHILL烟,喝茶,养鱼
瑞典人,住5号白房子,抽BLUE_MASTER烟,喝啤酒,养狗
第6个解答 2016/1/5 16:09:49:
挪威人,住1号绿房子,抽PALL_MALL烟,喝咖啡,养鸟
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
瑞典人,住3号白房子,抽混合烟,喝牛奶,养狗
英国人,住4号红房子,抽BLUE_MASTER烟,喝啤酒,养马
丹麦人,住5号黄房子,抽DUNHILL烟,喝茶,养鱼
...........................
下面的输出我省略了,有兴趣的人请自己去安装一个 vs 2015 社区版开发工具,自己去运行一下。using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var result = from p1 in Get个体(国籍.丹麦)
where p1.喝 == 饮料.茶
from p2 in Get个体(国籍.德国, p1)
where p2.抽 == 烟.PRINCE
from p3 in Get个体(国籍.挪威, p1, p2)
where p3.门牌号 == 1
from p4 in Get个体(国籍.瑞典, p1, p2, p3)
where p4.养 == 宠物.狗
from p5 in Get个体(国籍.英国, p1, p2, p3, p4)
where p5.住 == 房子.红
let game = new List<个体> { p1, p2, p3, p4, p5 }
let 绿房子的人 = game.First(y => y.住 == 房子.绿)
let 白房子的人 = game.First(y => y.住 == 房子.白)
where 绿房子的人.门牌号 < 白房子的人.门牌号
let 抽混合烟的人 = game.First(y => y.抽 == 烟.混合)
let 养猫的人 = game.First(y => y.养 == 宠物.猫)
where Math.Abs(抽混合烟的人.门牌号 - 养猫的人.门牌号) == 1
let 养马的人 = game.First(y => y.养 == 宠物.马)
let 抽DUNHILL的人 = game.First(y => y.抽 == 烟.DUNHILL)
where Math.Abs(养马的人.门牌号 - 抽DUNHILL的人.门牌号) == 1
let 蓝房子的人 = game.First(y => y.住 == 房子.蓝)
where Math.Abs(p3.门牌号 - 蓝房子的人.门牌号) == 1
let 喝矿泉水的人 = game.First(y => y.喝 == 饮料.矿泉水)
where Math.Abs(抽混合烟的人.门牌号 - 喝矿泉水的人.门牌号) == 1
let 黄房子的人 = game.First(y => y.住 == 房子.黄)
where 黄房子的人.抽 == 烟.DUNHILL
where 绿房子的人.喝 == 饮料.咖啡
let 中间房子的人 = game.First(x => x.门牌号 == 3)
where 中间房子的人.喝 == 饮料.牛奶
let 抽BLUE_MASTER的人 = game.First(y => y.抽 == 烟.BLUE_MASTER)
where 抽BLUE_MASTER的人.喝 == 饮料.啤酒
let 抽PALL_MAL的人 = game.First(y => y.抽 == 烟.PALL_MALL)
where 抽PALL_MAL的人.养 == 宠物.鸟
select game;
int cnt = 0;
Console.WriteLine("{0}开始查找:", DateTime.Now);
foreach (var g in result)
{
Console.WriteLine("第{0}个解答 {1}:", ++cnt, DateTime.Now);
foreach (var x in g.OrderBy(x => x.门牌号))
Console.WriteLine("{0}人,住{1}号{2}房子,抽{3}烟,喝{4},养{5}", x.人, x.门牌号, x.住, x.抽, x.喝, x.养);
Console.WriteLine();
}
Console.WriteLine("{0}结束________________________按任意键结束", DateTime.Now);
Console.ReadKey();
}
/// <summary>
/// 注意这里的嵌套顺序以及array参数,对用户体验的影响
/// </summary>
/// <param name="p">待生成的国籍</param>
/// <param name="array">要与这些个体不同</param>
/// <returns></returns>
private static IEnumerable<个体> Get个体(国籍 p, params 个体[] array)
{
var query = from 饮料 c in Enum.GetValues(typeof(饮料))
where !array.Any(x => x.喝 == c)
from 烟 b in Enum.GetValues(typeof(烟))
where !array.Any(x => x.抽 == b)
from 宠物 d in Enum.GetValues(typeof(宠物))
where !array.Any(x => x.养 == d)
from s in Enumerable.Range(1, 5)
where !array.Any(x => x.门牌号 == s)
from 房子 a in Enum.GetValues(typeof(房子))
where !array.Any(x => x.住 == a)
select new 个体 { 人 = p, 住 = a, 门牌号 = s, 抽 = b, 喝 = c, 养 = d };
foreach (var r in query)
yield return r;
}
}
public class 个体
{
public 国籍 人;
public 房子 住;
public 烟 抽;
public 饮料 喝;
public 宠物 养;
public int 门牌号;
}
public enum 国籍
{
英国, 瑞典, 丹麦, 挪威, 德国
}
public enum 房子
{
红, 白, 绿, 黄, 蓝
}
public enum 烟
{
PALL_MALL, DUNHILL, BLUE_MASTER, PRINCE, 混合
}
public enum 饮料
{
茶, 咖啡, 牛奶, 啤酒, 矿泉水
}
public enum 宠物
{
狗, 鸟, 猫, 鱼, 马
}
}
其实运行结果并不重要,重要地是把一个可以脱离人工而自动运行的代码写出来了。一旦写出来,那么下一步就可以 DEBUG。
如果没有办法去真正编程,并没有能符合这个论坛所谓“开发”的目的。
运行结果可以自己试打印一下哦!
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var result = from p1 in Get个体(国籍.丹麦)
where p1.喝 == 饮料.茶
from p2 in Get个体(国籍.德国, p1)
where p2.抽 == 烟.PRINCE
from p3 in Get个体(国籍.挪威, p1, p2)
where p3.养 == 宠物.狗
where p3.门牌号 == 1
from p4 in Get个体(国籍.瑞典, p1, p2, p3)
from p5 in Get个体(国籍.英国, p1, p2, p3, p4)
where p5.住 == 房子.红
let game = new List<个体> { p1, p2, p3, p4, p5 }
let 绿房子的人 = game.First(y => y.住 == 房子.绿)
let 白房子的人 = game.First(y => y.住 == 房子.白)
where 绿房子的人.门牌号 < 白房子的人.门牌号
let 抽混合烟的人 = game.First(y => y.抽 == 烟.混合)
let 养猫的人 = game.First(y => y.养 == 宠物.猫)
where Math.Abs(抽混合烟的人.门牌号 - 养猫的人.门牌号) == 1
let 养马的人 = game.First(y => y.养 == 宠物.马)
let 抽DUNHILL的人 = game.First(y => y.抽 == 烟.DUNHILL)
where Math.Abs(养马的人.门牌号 - 抽DUNHILL的人.门牌号) == 1
let 蓝房子的人 = game.First(y => y.住 == 房子.蓝)
where Math.Abs(p3.门牌号 - 蓝房子的人.门牌号) == 1
let 喝矿泉水的人 = game.First(y => y.喝 == 饮料.矿泉水)
where Math.Abs(抽混合烟的人.门牌号 - 喝矿泉水的人.门牌号) == 1
let 黄房子的人 = game.First(y => y.住 == 房子.黄)
where 黄房子的人.抽 == 烟.DUNHILL
where 绿房子的人.喝 == 饮料.咖啡
let 中间房子的人 = game.First(x => x.门牌号 == 3)
where 中间房子的人.喝 == 饮料.牛奶
let 抽BLUE_MASTER的人 = game.First(y => y.抽 == 烟.BLUE_MASTER)
where 抽BLUE_MASTER的人.喝 == 饮料.啤酒
let 抽PALL_MAL的人 = game.First(y => y.抽 == 烟.PALL_MALL)
where 抽PALL_MAL的人.养 == 宠物.鸟
select game;
int cnt = 0;
Console.WriteLine("{0}开始查找:", DateTime.Now);
foreach (var g in result)
{
Console.WriteLine("第{0}个解答 {1}:", ++cnt, DateTime.Now);
foreach (var x in g.OrderBy(x => x.门牌号))
Console.WriteLine("{0}人,住{1}号{2}房子,抽{3}烟,喝{4},养{5}", x.人, x.门牌号, x.住, x.抽, x.喝, x.养);
Console.WriteLine();
}
Console.WriteLine("{0}结束________________________按任意键结束", DateTime.Now);
Console.ReadKey();
}
/// <summary>
/// 注意这里的嵌套顺序以及array参数,对用户体验的影响
/// </summary>
/// <param name="p">待生成的国籍</param>
/// <param name="array">要与这些个体不同</param>
/// <returns></returns>
private static IEnumerable<个体> Get个体(国籍 p, params 个体[] array)
{
var query = from 饮料 c in Enum.GetValues(typeof(饮料))
where !array.Any(x => x.喝 == c)
from 烟 b in Enum.GetValues(typeof(烟))
where !array.Any(x => x.抽 == b)
from 宠物 d in Enum.GetValues(typeof(宠物))
where !array.Any(x => x.养 == d)
from s in Enumerable.Range(1, 5)
where !array.Any(x => x.门牌号 == s)
from 房子 a in Enum.GetValues(typeof(房子))
where !array.Any(x => x.住 == a)
select new 个体 { 人 = p, 住 = a, 门牌号 = s, 抽 = b, 喝 = c, 养 = d };
foreach (var r in query)
yield return r;
}
private static bool 装逼个性(个体 obj, params 个体[] arr)
{
for (var i = 0; i < arr.Length; ++i)
{
var x = arr[i];
if (obj.住 == x.住 || obj.养 == x.养 || obj.喝 == x.喝 || obj.抽 == x.抽 || obj.门牌号 == x.门牌号)
return false;
}
return true;
}
}
public class 个体
{
public 国籍 人;
public 房子 住;
public 烟 抽;
public 饮料 喝;
public 宠物 养;
public int 门牌号;
}
public enum 国籍
{
英国, 瑞典, 丹麦, 挪威, 德国
}
public enum 房子
{
红, 白, 绿, 黄, 蓝
}
public enum 烟
{
PALL_MALL, DUNHILL, BLUE_MASTER, PRINCE, 混合
}
public enum 饮料
{
茶, 咖啡, 牛奶, 啤酒, 矿泉水
}
public enum 宠物
{
狗, 鸟, 猫, 鱼, 马
}
}
电脑不够强劲。可以看看打印结果2016/1/3 0:28:54开始查找:
第1个解答 2016/1/3 0:30:32:
挪威人,住1号绿房子,抽混合烟,喝咖啡,养狗
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
瑞典人,住3号黄房子,抽DUNHILL烟,喝牛奶,养鱼
英国人,住4号红房子,抽BLUE_MASTER烟,喝啤酒,养马
丹麦人,住5号白房子,抽PALL_MALL烟,喝茶,养鸟
第2个解答 2016/1/3 0:42:25:
挪威人,住1号绿房子,抽混合烟,喝咖啡,养狗
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
瑞典人,住3号白房子,抽PALL_MALL烟,喝牛奶,养鸟
丹麦人,住4号黄房子,抽DUNHILL烟,喝茶,养鱼
英国人,住5号红房子,抽BLUE_MASTER烟,喝啤酒,养马
第3个解答 2016/1/3 0:42:25:
挪威人,住1号绿房子,抽混合烟,喝咖啡,养狗
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
英国人,住3号红房子,抽PALL_MALL烟,喝牛奶,养鸟
丹麦人,住4号黄房子,抽DUNHILL烟,喝茶,养鱼
瑞典人,住5号白房子,抽BLUE_MASTER烟,喝啤酒,养马
第4个解答 2016/1/3 0:42:57:
挪威人,住1号绿房子,抽混合烟,喝咖啡,养狗
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
瑞典人,住3号白房子,抽PALL_MALL烟,喝牛奶,养鸟
英国人,住4号红房子,抽BLUE_MASTER烟,喝啤酒,养马
丹麦人,住5号黄房子,抽DUNHILL烟,喝茶,养鱼
第5个解答 2016/1/3 0:42:57:
挪威人,住1号绿房子,抽混合烟,喝咖啡,养狗
德国人,住2号蓝房子,抽PRINCE烟,喝矿泉水,养猫
英国人,住3号红房子,抽PALL_MALL烟,喝牛奶,养鸟
瑞典人,住4号白房子,抽BLUE_MASTER烟,喝啤酒,养马
丹麦人,住5号黄房子,抽DUNHILL烟,喝茶,养鱼
2016/1/3 1:02:00结束________________________按任意键结束